16일차 - 알고리즘 코드카타

2024. 8. 6. 10:28·Java & Spring/코딩테스트

- 회고

66. 대충 만든 자판 https://school.programmers.co.kr/learn/courses/30/lessons/160586

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] result = new int[targets.length];
        for(int i = 0; i < targets.length; i++){
           int answer = 0;
           for(int j = 0; j < targets[i].length(); j++){
               char c = targets[i].charAt(j);
               int push = Integer.MAX_VALUE;
               for(int q = 0; q < keymap.length; q++){
                   if(keymap[q].indexOf(c) != -1 && push > keymap[q].indexOf(c)){
                       push = keymap[q].indexOf(c) + 1;
                   }
               }
               if(push == Integer.MAX_VALUE){
                   answer = -1;
                   break;
               }else{
                   answer += push;
               }
           }
           result[i] = answer;
       }
        return result;
    }
}

- 풀이 과정 

  1. targets을 도는 첫번째 for문
  2. targets의 각 단어에 접근하는 두번째 for문
  3. keymap에 접근하는 세번째 for문
  4. String.indexOf()로 포함여부 확인(포함되지 않으면 -1을 반환함)
  5. 최소 입력값을 구해야하므로 int push변수와 비교하여 더 작으면 push값에 대입
  6. push값이 초기값에서 변화가 없다면 만들 수 없는 단어이므로 -1를 반환하고 반복문 종료
  7. push값이 정상적으로 변동됐다면 answer값에 추가
  8. 반복문이 끝나면 answer값을 result배열에 순서대로 대입

- 회고

3중 for문으로 시간복잡도상 매우 비효율적인 코드일거라 생각하여 ChatGPT에 질문해봤다.

import java.util.HashMap;
import java.util.Map;

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        // 각 문자에 대한 최소 키 입력 수를 저장하는 맵을 생성
        Map<Character, Integer> keyPressMap = new HashMap<>();
        
        // 키맵을 분석하여 각 문자의 최소 키 입력 수를 계산
        for (String key : keymap) {
            for (int i = 0; i < key.length(); i++) {
                char c = key.charAt(i);
                // 해당 문자가 처음 발견되거나 더 적은 입력 수로 발견되었을 때 업데이트
                keyPressMap.put(c, Math.min(keyPressMap.getOrDefault(c, Integer.MAX_VALUE), i + 1));
            }
        }

        int[] result = new int[targets.length];
        
        // 각 타겟 문자열에 대해 최소 키 입력 수 계산
        for (int i = 0; i < targets.length; i++) {
            int answer = 0;
            for (int j = 0; j < targets[i].length(); j++) {
                char c = targets[i].charAt(j);
                if (keyPressMap.containsKey(c)) {
                    answer += keyPressMap.get(c);
                } else {
                    answer = -1; // 해당 문자가 키맵에 존재하지 않음
                    break;
                }
            }
            result[i] = answer;
        }
        
        return result;
    }
}

 

 

keyPressMap.put(c, Math.min(keyPressMap.getOrDefault(c, Integer.MAX_VALUE), i + 1))
  • 해당 부분에서 각 문자에 대한 수치를 Math.min을 통해 최소값으로 map에 저장
  • for문을 통해서 key의 포함여부를 확인하고 포함된다면 value값을 answer에 증가

 

- 진행

일자 완료 번호
24.07.16 ~ 24.07.31 1~63
24.08.01 64
24.08.02 65
24.08.05 66
   
   
   
   
   
   
   
   
   

 

 

'Java & Spring > 코딩테스트' 카테고리의 다른 글

18일차 - 알고리즘 코드카타  (0) 2024.08.07
17일차 - 알고리즘 코드카타  (0) 2024.08.06
15일차 - 알고리즘 코드카타  (0) 2024.08.05
14일차 - 알고리즘 코드카타  (0) 2024.08.01
13일차 - 알고리즘 코드카타(시간초과)  (0) 2024.07.31
'Java & Spring/코딩테스트' 카테고리의 다른 글
  • 18일차 - 알고리즘 코드카타
  • 17일차 - 알고리즘 코드카타
  • 15일차 - 알고리즘 코드카타
  • 14일차 - 알고리즘 코드카타
DJ.Kang
DJ.Kang
백엔드 개발 기록 블로그
  • DJ.Kang
    DJ Hello World
    DJ.Kang
  • 전체
    오늘
    어제
    • 분류 전체보기
      • 이론공부
      • 시스템설계
      • Java & Spring
        • TIL
        • 트러블슈팅
        • 고도화
        • 알고리즘
        • 코딩테스트
        • Java
        • Spring
        • Thymeleaf
      • 프로젝트
        • coin-trading
        • 트러블슈팅
      • Docker
      • DB
      • AWS
      • CI-CD
      • 웹
      • git & github
      • 구인공고분석
  • 블로그 메뉴

    • 홈
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    java 멤버
    java super
    java기초
    java 에라토스테네스의 체
    개발로드맵
    프로그래머스 java 기초 트레이닝
    java enhance switch
    데이터 타입
    프로그래머스 java 기초트레이닝
    Java 생성자
    java 메서드
    자료구조
    Java this
    java
    java 유클리드 호제법
    java 제어자
    java two-pointer
    데이터 크기
    java 세수의합
    java arrays.copyofrnage()
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.1
DJ.Kang
16일차 - 알고리즘 코드카타
상단으로

티스토리툴바