[프로그래머스] 대충 만든 자판

fsm12·2023년 7월 19일
0

프로그래머스

목록 보기
41/57
post-thumbnail

문제링크

문제 이해

[ 입력형태 / 조건 ]

keymap
1번 키부터 차례대로 할당된 문자들이 순서대로 담긴 문자열배열 | ["ABACD", "BCEFD"] | 1 ≤ keymap의 길이 ≤ 100, 1 ≤ keymap의 원소의 길이 ≤ 100, keymap[i]는 i + 1번 키를 눌렀을 때 순서대로 바뀌는 문자를 의미, keymap의 원소의 길이는 서로 다를 수 있음

targets
입력하려는 문자열들이 담긴 문자열 배열 | ["ABCD","AABB"] | 1 ≤ targets의 길이 ≤ 100, 1 ≤ targets의 원소의 길이 ≤ 100, targets의 원소는 알파벳 대문자로만 구성

[ 문제 ]

각 문자열을 작성하기 위해 키를 최소 몇 번씩 눌러야 하는지 순서대로 배열에 담아 return
(단, 목표 문자열을 작성할 수 없을 때는 -1을 저장)

[ 풀이 ]

알파벳 크기만큼 배열을 선언해서, 가장 빠르게 접근할때 누르는 횟수를 저장함. 해당 알파벳이 나오면 저장해둔 최소 횟수만큼 증가시키고, 없던 문자이면 -1을 리턴



코드

> [성공] 1차 시도 : 구현

  • 생각한 풀이 그대로 구현
import java.util.*;

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] min_push = new int[26];
        Arrays.fill(min_push, Integer.MAX_VALUE);
        
        for(int i=0; i<keymap.length; i++){
            for(int j=0; j<keymap[i].length(); j++){
                int idx = keymap[i].charAt(j)-'A';
                min_push[idx] = Math.min(min_push[idx], j+1);
            }
        }
        
        int[] ans = new int[targets.length];
        for(int i=0; i<targets.length; i++){
            for(char c : targets[i].toCharArray()){
                int cnt = min_push[c-'A'];
                if(cnt == Integer.MAX_VALUE){
                    ans[i] = -1;
                    break;
                }
                ans[i] += cnt;
            }
        }
        
        return ans;
    }
}


=> targets의 문자열의 길이가 제각각일수 있는데, 그 부분을 고려하지 않아 런타임에러 및 틀린 케이스를 접해 많이 헤맸음



Tip : 길이로 연산할때, 0번째 인덱스로만 해도 되는지, 그때그때 새롭게 길이를 가져와야하는지 고려해야 한다.

1개의 댓글

comment-user-thumbnail
2023년 7월 19일

글 잘 봤습니다, 감사합니다.

답글 달기