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

홍성진·2023년 2월 23일
0

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

i번째 자판을 j번 눌렀을 때 할당되는 문자를 keymap[i][j]로 갖는 배열 keymap이 주어집니다. 이때 target 문자열을 만들기 위해 눌러야 하는 자판수의 최솟값을 구하는 문제입니다.

핸드폰의 천지인 키보드를 예로 'ㄴㄴ'을 치려면 5, 스페이스, 5를 눌러야 하지만 스페이스는 무시하고 자판만 카운트하여 2회가 필요한 것으로 간주합니다.

먼저 keymap을 읽으며 문자별 최소 횟수를 dictionary에 저장해놓고, 나중에 target을 읽으며 편하게 카운트하겠습니다. 최소 횟수가 되어야 하므로 keymap[j]의 글자를 자판수별로 읽습니다.

keymap[0]을 1번 눌렀을 때, keymap[1]을 1번 눌렀을때, ... , keymap[n]을 1번 눌렀을 때,

keymap[0]을 2번 눌렀을 때, keymap[1]을 2번 눌렀을때, ... , keymap[n]을 2번 눌렀을 때,
...

keymap[0]을 100번 눌렀을 때, keymap[1]을 100번 눌렀을때, ... , keymap[n]을 100번 눌렀을 때,

keymap[j]의 글자수는 j에 따라 다르기 때문에 if (keymap[j].length() > i)라는 조건을 걸어주고, dict.get(cur) == null이라면 cur가 i번째 글자에서 최초로 등장했다는 뜻이니까 dictionary에 저장해줍니다. (null이 아니라면 이미 그 전에 등장한 전력이 있으니 지나갑니다)

import java.util.*;

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];
        HashMap<String, Integer> dict = new HashMap<>();
        
        for (int i = 0; i < 100; i++) {
            for (int j = 0; j < keymap.length; j++) {
                if (keymap[j].length() > i) {
                    String cur = keymap[j].substring(i, i + 1);
                    if (dict.get(cur) == null) {
                        dict.put(cur, i + 1);
                    }
                }
            }
        }
        
        for (int i = 0; i < targets.length; i++) {
            for (int j = 0; j < targets[i].length(); j++) {
                String cur = targets[i].substring(j, j + 1);
                if (dict.get(cur) == null) {
                    answer[i] = -1;
                    break;
                }
                answer[i] += dict.get(cur);
            }
        }
        
        return answer;
    }
}

0개의 댓글