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;
}
}