class Solution {
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[targets.length];
//target 배열 하나씩
loop1: for (int q=0;q< targets.length;q++) {
int sumEachTouch=0;
//"ABCD"에서 하나씩
for (int i=0;i<targets[q].length();i++) {
int minTouch = 1000;
//keymap 배열 하나씩
for (int j = 0; j < keymap.length; j++) {
//"ABACD"에서 하나씩
for (int k = 0; k < keymap[j].length(); k++) {
if (keymap[j].charAt(k) == targets[q].charAt(i) && (k + 1) < minTouch) {
minTouch = k + 1;
continue;
}
}
}
if (minTouch == 1000) {
answer[q] = -1;
continue loop1;
}
sumEachTouch+=minTouch;
}
answer[q] = sumEachTouch;
}
return answer;
}
}
먼저 주석과 같이 for문을 4개 만들었다.
그 후 필요한 조건을 채워 나갔다.
"오 길이 100개밖에 안되네? for문으로 풀어도 문제 없겠네!"
하고 사람이 문제를 풀듯이 하나씩 풀어가며 적어보느라 아주 그냥 힘들었다.
스터디에서 다른 분께서 푼 걸 보니 HashMap으로 편하게 풀 수 있다는걸 알았다.
import java.util.*;
class Solution {
public int[] solution(String[] keymap, String[] targets) {
int[] answer = new int[targets.length];
HashMap<Character,Integer> map = new HashMap<>();
for (String key : keymap) {
for (int j = 0; j < key.length(); j++) {
char ch = key.charAt(j);
if (map.containsKey(ch)){
if(map.get(ch)>j){
map.replace(ch,j+1);
}
}else{
map.put(ch,j+1);
}
}
}
for(int i=0; i< targets.length;i++){
int sum = 0;
for(int j=0; j<targets[i].length();j++){
char ch = targets[i].charAt(j);
if(map.containsKey(ch)){
sum+=map.get(ch);
}else{
sum = -1;
break;
}
}
answer[i] = sum;
}
return answer;
}
}
먼저 해시맵을 선언하여 key값으로 keymap의 문자를, value로 keymap 중에서 그 문자가 가장 빨리 나오는 횟수를 넣어준다.
(이제보니 keymap의 이름부터가 map이었던 것이다..!)
그 다음 targets에서 문자에 따라 눌러야하는 횟수를 더해 담아준다.
만약 문자가 없어 더해지지 않았다면 -1이 담기게 해준다.
내가 너무 시야가 좁은거 아닐까 싶다. 풀기 전에 다각도로 생각해보자!