[프로그래머스] - 대충 만든 자판

YongHyun·2023년 5월 26일
0
post-thumbnail

대충 만든 자판

문제 풀이

먼저 입출력 예제 중 keymap = ["ABACD", "BCEFD"], targets = ["ABCD","AABB"] 를 예시로 설명해보겠다.

keymap[0] 이 뜻하는 바는 키를 누를때마다 A - B - A - C - D 순으로 바뀐다는 뜻이고
keymap[1] 이 뜻하는 바는 키를 누를때마다 B - C - E - F - D 순으로 바뀐다는 뜻이다.

그러면 targets[0] 을 살펴보자 첫번째로 나오는 문자는 A 이다. keymap[0], keymap[1] 중 가장 먼저 나오는 문자는 keymap[0] 의 첫번째 인덱스이므로 키를 한번만 누르면 된다.

두번째로 나오는 문자는 B 이다. keymap[0], keymap[1] 중 가장 먼저 나오는 문자는 keymap[1] 의 첫번째 인덱스이므로 키를 한번만 누르면 된다.

세번째로 나오는 문자는 C 이다. keymap[0], keymap[1] 중 가장 먼저 나오는 문자는 keymap[1] 의 두번째 인덱스이므로 키를 두번만 누르면 된다.

이렇게 순서대로 구현하면 되는데 이때 나는 int[] 배열 형태를 만든 후에 keymap 을 순회하면서 인덱스의 최소값으로 변경 해주는 방식으로 하려다가 HashMap 을 사용하면 더욱 편리하다고 판단하여서 HashMap 으로 구현하였다.

HashMap<String, Integer> map = new HashMap(); 
// String 형태에는 문자, Integer 형태에는 키를 가장 빠르게 누를 수 있는 갯수

이를 코드에 적용하면 다음과 같다.

import java.util.*;

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];
        HashMap<Character, Integer> map = new HashMap();
        
        for(String key : keymap) {
            for(int i = 0; i < key.length(); i++) {
                char c = key.charAt(i);
                if(!map.containsKey(c) || i < map.get(c))
                    map.put(c, i + 1);
            }
        }
        
        for(int i = 0; i < targets.length; i++) {
            char[] target = targets[i].toCharArray();
            int count = 0;
            for(int j = 0; j < target.length; j++) {
                char c = target[j];
                if(!map.containsKey(c)) {
                    count = -1;
                    break;                    
                }else {
                    count += map.get(c);
                }
            }
            answer[i] = count == -1 ? -1 : count;        
        }    
        return answer;
    }
}

회고

간단하게 생각하면 쉽게 풀 수 있는 문제인 것 같았는데 어렵게 생각해서 그런지 문제 지문을 이해하는데도 3 ~ 4번 정도 읽어야 이해되었었고 int[] 배열 형태로 알파벳 대문자 26개가 들어가게 하려고 시도하다 HashMap 이 더 코드가 간결해질 것 같아서 다시 수정하였다. 문제를 보고 HashMap 이 떠오를 정도로 좀 더 다양한 문제를 많이 풀어야겠다고 생각한 문제였던 것 같다.

profile
백엔드 개발자 되기 위한 여정

0개의 댓글