[프로그래머스] lv.1 대충 만든 자판 (57%)

ayboori·2024년 8월 7일
0

Java Study

목록 보기
33/34

풀이 로직

알파벳 배열을 생성
모든 값을 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해도 될듯

Arrays.fill(arr, index);

arr의 모든 값을 index로 채운다.

Math.min(A,B);

A와 B 중 최솟값을 리턴한다

key.charAt(i) - 'A'

내가 위에서 작성한 코드인 alphabet[(int)keyArr[i]-65] 보다 더 직관적이다

이외의 다른 사람의 풀이

해시맵, 배열 등을 통해 최소 키 누름 횟수를 저장했다.

profile
프로 개발자가 되기 위해 뚜벅뚜벅.. 뚜벅초

0개의 댓글