(Java)프로그래머스 - 대충 만든 자판

윤준혁·2024년 3월 6일

나의 풀이

import java.util.*;

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];
        HashMap<Character, Integer> map = new HashMap<>(); // 1
        int a = 1;
        
        for (int i = 0; i < keymap.length; i++) { // 2
            for (int j = 0; j < keymap[i].length(); j++) {
                if (map.containsKey(keymap[i].charAt(j))) { // 3
                    map.put(keymap[i].charAt(j), Math.min(a, map.get(keymap[i].charAt(j))));
                } else {
                    map.put(keymap[i].charAt(j), a);
                }
                a++;
            }
            a = 1;
        }
        
        for (int i = 0; i < targets.length; i++) { // 4
            int sum = 0;
            boolean is = true;
            for (int j = 0; j < targets[i].length(); j++) { // 5
                if (map.containsKey(targets[i].charAt(j))) {
                    sum += map.get(targets[i].charAt(j));
                } else {
                    is = false;
                }
            }
            answer[i] = is ? sum : -1; // 6
        }
        
        return answer;
    }
}

과정

  1. keymap에 있는 String을 담을 key값이 Character이고, value값이 Integer인 HashMap을 선언하고, 누른 횟수를 카운트할 정수 a를 선언한다(누른 횟수라서 시작을 1)
  2. keymap 배열의 길이와 keymap[i]의 문자열의 길이를 순회하는 반복문을 선언
  3. map에 keymap[i]의 j번째 문자가 key값으로 없다면 그 문자를 key로 하고 a를 value로 넣어주고, 있으면 value값을 비교해서 더 작은 value를 넣어준다(HashMap의 특성상 같은 key값으로 중복이 불가능, 비교해서 넣지않으면 나중에 들어온 값이 덮어씌워진다) 그리고 같은 keymap[i]번째를 비교하는 것이므로 a를 증가시켜주고, i가 끝나기 전에 a를 1로 초기화
  4. targets의 길이만큼 순회하는 반복문을 선언하고 누른 횟수를 더해줄 sum과 map에 없는 문자를 담고있는지를 확인할 is를 선언
  5. keymap과 같이 targets[i]의 문자열을 순회하는 반복문을 선언하고, 만약 map에 해당하는 key가 없으면 is를 false로 바꿔주고 break, 있으면 value값을 sum에 더해준다
  6. answer[i]가 참이면 sum을 배열에 넣어주고, 거짓이면 -1을 넣어준다

다른 사람 풀이

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++) {
                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++) {
                if (minTouch[target.charAt(j) - 'A'] == 200) {
                    canMake = false;
                    break;
                }
                sum += minTouch[target.charAt(j) - 'A'];
            }
            answer[i] = canMake ? sum : -1;
        }
        return answer;
    }
}
  • 내 코드를 돌렸을 때보다 더 빠른 시간에 컴파일된다. 시간복잡도는 같지만 배열은 고정 크기의 메모리를 사용하므로 컴파일 시간이 빠르고, 반면에 HashMap은 동적으로 메모리를 할당하므로 컴파일 시간이 좀 더 걸릴 수 있다고 한다.

0개의 댓글