728x90
반응형
📜 문제 내용
🤔 과정
- keymap의 길이와 원소 길이가 최대 100이고, targets의 길이의 원소 길이 또한 최대 100인 제한 사항을 보고 이중 for문을 돌려도 최대 10,000이기 때문에 이중 for문을 마음 놓고 활용할 수 있다고 생각했다.
- 어떤 key를 사용하든 최솟 값만 추출해 사용하는 것이기 때문에, hashMap으로 알파벳과 누른 횟수를 맵핑시켜서 최솟값을 넣으면 된다고 판단했다.
- 그래서 반복문을 순회하면서 누른 횟수를 계속 비교하고 최솟값으로 덮어버린다.
- target은 이미 만든 hashMap을 활용해 key 값이 없으면 바로 -1을 넣고 반복문을 중지시키고, 있으면 총 누른 횟수 cnt 에 누적합 시켜 최종 값을 answer 배열에 넣는다.
- 어차피 hashMap 안에 있는 누른 횟수 value들이 최솟값으로 구성되어 있어서 cnt에 바로 누적합하면 그것이 최소 총 누른 횟수이다.
✨ 최초 제출 답안 - 🙆♂️ 통과
import java.util.*;
class Solution {
public int[] solution(String[] keymap, String[] targets) {
HashMap<String, Integer> map = new HashMap<>();
for(int i = 0; i < keymap.length; i++){
String[] str = keymap[i].split("");
for(int j = 0; j < str.length; j++){
// 해당 알파벳과 누른 횟수를 저장
// 만약 해당 알파벳이 이미 저장되어 있다면
// 저장된 값과 현재 누른 횟수 중 최솟값을 저장
// 새로운 알파벳이라면 누른 횟수 그대로 저장
map.put(str[j], map.containsKey(str[j]) ? Math.min(map.get(str[j]), j + 1) : j + 1);
}
}
int targetsLen = targets.length;
int[] answer = new int[targetsLen];
for(int i = 0; i < targetsLen; i++){
int cnt = 0; // 총 누른 횟수의 최솟값
String[] target = targets[i].split("");
for(int j = 0; j < target.length; j++){
// map 안에 알파벳이 저장되어 있지 않으면
// 바로 -1 넣고 반복문 탈출
if(!map.containsKey(target[j])){
answer[i] = -1;
break;
}
// 누른 횟수들을 cnt에 저장하고
// target 끝까지 가면 answer에 총 횟수 저장
cnt += map.get(target[j]);
if(j == target.length - 1) answer[i] = cnt;
}
}
return answer;
}
}
- target의 이중 for문 내 코드가 아직 마음에 들지 않아서 더 괜찮은 코드가 없을 지 생각 중이다.
- hashMap을 조금 자유자재로 쓰게 된 것 같아 뿌듯했다.
🔗 문제 링크
728x90
반응형