


나의 풀이
import java.util.*;
class Solution {
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[targets.length];
HashMap<Character, Integer> map = new HashMap<>(); // 1
int a = 1;
for (int i = 0; i < keymap.length; i++) { // 2
for (int j = 0; j < keymap[i].length(); j++) {
if (map.containsKey(keymap[i].charAt(j))) { // 3
map.put(keymap[i].charAt(j), Math.min(a, map.get(keymap[i].charAt(j))));
} else {
map.put(keymap[i].charAt(j), a);
}
a++;
}
a = 1;
}
for (int i = 0; i < targets.length; i++) { // 4
int sum = 0;
boolean is = true;
for (int j = 0; j < targets[i].length(); j++) { // 5
if (map.containsKey(targets[i].charAt(j))) {
sum += map.get(targets[i].charAt(j));
} else {
is = false;
}
}
answer[i] = is ? sum : -1; // 6
}
return answer;
}
}
과정
- keymap에 있는 String을 담을 key값이 Character이고, value값이 Integer인 HashMap을 선언하고, 누른 횟수를 카운트할 정수 a를 선언한다(누른 횟수라서 시작을 1)
- keymap 배열의 길이와 keymap[i]의 문자열의 길이를 순회하는 반복문을 선언
- map에 keymap[i]의 j번째 문자가 key값으로 없다면 그 문자를 key로 하고 a를 value로 넣어주고, 있으면 value값을 비교해서 더 작은 value를 넣어준다(HashMap의 특성상 같은 key값으로 중복이 불가능, 비교해서 넣지않으면 나중에 들어온 값이 덮어씌워진다) 그리고 같은 keymap[i]번째를 비교하는 것이므로 a를 증가시켜주고, i가 끝나기 전에 a를 1로 초기화
- targets의 길이만큼 순회하는 반복문을 선언하고 누른 횟수를 더해줄 sum과 map에 없는 문자를 담고있는지를 확인할 is를 선언
- keymap과 같이 targets[i]의 문자열을 순회하는 반복문을 선언하고, 만약 map에 해당하는 key가 없으면 is를 false로 바꿔주고 break, 있으면 value값을 sum에 더해준다
- answer[i]가 참이면 sum을 배열에 넣어주고, 거짓이면 -1을 넣어준다
다른 사람 풀이
import java.util.*;
class Solution {
public int[] solution(String[] keymap, String[] targets) {
int[] minTouch = new int['Z' - 'A' + 1];
Arrays.fill(minTouch, 200);
for (String key : keymap) {
for (int i = 0; i < key.length(); i++) {
minTouch[key.charAt(i) - 'A'] = Math.min(minTouch[key.charAt(i) - 'A'], i + 1);
}
}
int[] answer = new int[targets.length];
for (int i = 0; i < targets.length; i++) {
String target = targets[i];
int sum = 0;
boolean canMake = true;
for (int j = 0; j < target.length(); j++) {
if (minTouch[target.charAt(j) - 'A'] == 200) {
canMake = false;
break;
}
sum += minTouch[target.charAt(j) - 'A'];
}
answer[i] = canMake ? sum : -1;
}
return answer;
}
}
- 내 코드를 돌렸을 때보다 더 빠른 시간에 컴파일된다. 시간복잡도는 같지만 배열은 고정 크기의 메모리를 사용하므로 컴파일 시간이 빠르고, 반면에 HashMap은 동적으로 메모리를 할당하므로 컴파일 시간이 좀 더 걸릴 수 있다고 한다.