문제
https://school.programmers.co.kr/learn/courses/30/lessons/160586
해답
class Solution {
public int[] solution(String[] targets, String[] keymap) {
String[][] eachTargets = new String[targets.length][targets[0].length()];
int[] answer = new int[keymap.length];
for(int i=0;i<targets.length;i++)
eachTargets[i] = targets[i].split("");
for(int i=0;i<keymap.length;i++){
String[] eachKeymap = keymap[i].split("");
int count = 0;
for(int j=0;j<eachKeymap.length;j++){ //keymap의 각 문자별로 순회
int eachCount = 0;
int minTargets = 200;
for(int k=0;k<eachTargets.length;k++){ //각 targets별로 순회
int min = 200;
for(int l=0;l<eachTargets[k].length;l++){ //각 targets의 글자별로 순회
if(eachKeymap[j].equals(eachTargets[k][l])){
min = Math.min((l+1),min);
break;
}
}
if(min!=200)
minTargets = Math.min(min,minTargets);
}
if(minTargets==200){
answer[i]=-1;
break;
}
else{
count+=minTargets;
}
}
if(answer[i]!=-1)
answer[i]=count;
}
return answer;
}
}
해설
문제가 상당히 반복의 횟수가 많다.
일단 keymap의 길이가 100이라는것을 착안하여 200을 최소 클릭횟수로 미리 담아두었으며
최솟값을 갱신하는 방식으로 각 클릭횟수를 처리하였다.
그리고 그것을 합하여 처리하는 방식으로 문제를 풀어냈는데
이때 만약에 만들수없는 문자가 하나라도 존재할 경우때문에 곤혹을 겪었다.
만들수 없는 문자가 존재할 경우에는 다른 문자들이 되더라도 -1로 return해주어야하는데
그것을 boolean으로 처리하던가, 아니면 answer에 -1을 미리 박아버리는 방식으로 처리해야하여 후자를 택하였다.
해당 경우를 위한 테스트케이스
keymap(string[]) : ["ABC"]
targets(string[]) : ["DA"]
Return : [-1]
이것을 테스트케이스에 추가하여 풀어보면 될것같다.
'Coding Test > JAVA 코딩테스트 풀이정리(프로그래머스)' 카테고리의 다른 글
프로그래머스 스쿨(Java - Lv.2) - 무인도[BFS] (0) | 2025.03.26 |
---|---|
프로그래머스 스쿨(Java - Lv.1) - 체육복[그리디 + priorityque] (0) | 2025.03.11 |
프로그래머스 스쿨(Java - Lv.2) - 디펜스 게임[그리디 + priorityque] (1) | 2025.03.04 |
프로그래머스 스쿨(Java - Lv.2) - 리코쳇 로봇[BFS] (1) | 2025.03.04 |
프로그래머스 스쿨(Java - Lv.2) - 완전범죄[DP - 메모아이징] (0) | 2025.03.03 |