알파벳 배열을 생성
모든 값을 0로 초기화
keymap의 문자를 하나씩 잘라서 알파벳 배열에 값 세팅, i+1이어야 한다
~ 이때 세팅하려는 배열의 값이 0이 아니어야 한다
targets의 값을 알파벳 배열에서 찾아 answer에 세팅
이때 targets의 값이 하나도 0이면 answer에 -1 세팅 후 break
class Solution {
public int[] solution(String[] keymap, String[] targets) {
// 알파벳 배열을 생성
int[] alphabet = new int[26];
// 모든 값을 0로 초기화
for(int a : alphabet){
a = 0;
}
// keymap의 문자를 하나씩 잘라서 알파벳 배열에 값 세팅, i+1이어야 한다
for(String key : keymap){
char[] keyArr = key.toCharArray();
for(int i = 0; i<keyArr.length; i++){
// 이떄 세팅하려는 배열 내의 값이 0이어야 한다
if(alphabet[(int)keyArr[i]-65] == 0
|| alphabet[(int)keyArr[i]-65] > i+1){
alphabet[(int)keyArr[i]-65] = i+1;
}
}
}
// targets의 값을 알파벳 배열에서 찾아 answer에 세팅
// 이때 targets의 값의 곱이 0이면 answer에 -1을 세팅
int[] answer = new int[targets.length];
int j = 0;
for(String t : targets){
char[] targetArr = t.toCharArray();
int answernum = 0;
for(int i = 0 ; i<targetArr.length; i++){
if(alphabet[(int)targetArr[i]-65] == 0){
answernum = -1;
break;
}
answernum += alphabet[(int)targetArr[i]-65];
}
answer[j] = answernum;
j++;
}
return answer;
}
}
테스트 1 〉 통과 (0.07ms, 72.2MB)
테스트 2 〉 통과 (0.11ms, 77.9MB)
테스트 3 〉 통과 (0.08ms, 77MB)
테스트 4 〉 통과 (0.13ms, 79.4MB)
테스트 5 〉 통과 (0.05ms, 73.1MB)
테스트 6 〉 통과 (0.08ms, 75.8MB)
테스트 7 〉 통과 (0.05ms, 77.9MB)
테스트 8 〉 통과 (0.09ms, 77.5MB)
테스트 9 〉 통과 (0.05ms, 72.5MB)
테스트 10 〉 통과 (0.09ms, 83.7MB)
테스트 11 〉 통과 (0.02ms, 77.4MB)
테스트 12 〉 통과 (0.02ms, 70.6MB)
테스트 13 〉 통과 (0.02ms, 75.9MB)
테스트 14 〉 통과 (0.37ms, 71.3MB)
테스트 15 〉 통과 (0.67ms, 79.1MB)
테스트 16 〉 통과 (0.43ms, 78.8MB)
테스트 17 〉 통과 (0.54ms, 80.6MB)
테스트 18 〉 통과 (0.54ms, 65.9MB)
테스트 19 〉 통과 (0.56ms, 78MB)
테스트 20 〉 통과 (0.32ms, 73.5MB)
테스트 21 〉 통과 (0.39ms, 73.7MB)
테스트 22 〉 통과 (0.43ms, 73.2MB)
테스트 23 〉 통과 (0.40ms, 73.8MB)
세팅하려는 배열의 값이 0일 때 뿐만 아니라 현재 세팅하려는 값보다 클 떄도 값을 변경해주어야 한다.
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++) {
// min 함수를 이용해 현재 세팅된 값과 새로운 값 중 작은 값을 세팅
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++) {
// 세팅 안 되어있을 경우 break;
if (minTouch[target.charAt(j) - 'A'] == 200) {
canMake = false;
break;
}
sum += minTouch[target.charAt(j) - 'A'];
}
// 생성 가능한 경우가 아니면 -1 세팅
answer[i] = canMake ? sum : -1;
}
return answer;
}
}
canMake 없이 그냥 -1할당하고 break해도 될듯
arr의 모든 값을 index로 채운다.
A와 B 중 최솟값을 리턴한다
내가 위에서 작성한 코드인 alphabet[(int)keyArr[i]-65]
보다 더 직관적이다
해시맵, 배열 등을 통해 최소 키 누름 횟수를 저장했다.