대충 만든 자판 (자바)

김재현·2023년 12월 1일
0

알고리즘 풀이

목록 보기
41/90
post-thumbnail

문제

업로드중..

정답 코드

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];

        //target 배열 하나씩
        loop1: for (int q=0;q< targets.length;q++) {

            int sumEachTouch=0;

            //"ABCD"에서 하나씩
            for (int i=0;i<targets[q].length();i++) {
                int minTouch = 1000;

                //keymap 배열 하나씩
                for (int j = 0; j < keymap.length; j++) {

                    //"ABACD"에서 하나씩
                    for (int k = 0; k < keymap[j].length(); k++) {
                        if (keymap[j].charAt(k) == targets[q].charAt(i) && (k + 1) < minTouch) {
                            minTouch = k + 1;
                            continue;
                        }
                    }
                }
                if (minTouch == 1000) {
                    answer[q] = -1;
                    continue loop1;
                }
                sumEachTouch+=minTouch;
            }
                answer[q] = sumEachTouch;
        }
        
        return answer;
    }
}

먼저 주석과 같이 for문을 4개 만들었다.
그 후 필요한 조건을 채워 나갔다.

  • minTouch를 1000으로 초기화한 이유: 목표 문자열을 작성할 수 없는 조건에 맞춰 -1을 담도록

"오 길이 100개밖에 안되네? for문으로 풀어도 문제 없겠네!"
하고 사람이 문제를 풀듯이 하나씩 풀어가며 적어보느라 아주 그냥 힘들었다.
스터디에서 다른 분께서 푼 걸 보니 HashMap으로 편하게 풀 수 있다는걸 알았다.

다른 사람 풀이

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 j = 0; j < key.length(); j++) {

                char ch = key.charAt(j);

                if (map.containsKey(ch)){
                    if(map.get(ch)>j){
                        map.replace(ch,j+1);
                    }
                }else{
                    map.put(ch,j+1);
                }
            }
        }

        for(int i=0; i< targets.length;i++){
            int sum = 0;
            for(int j=0; j<targets[i].length();j++){

                char ch = targets[i].charAt(j);

                if(map.containsKey(ch)){
                    sum+=map.get(ch);
                }else{
                    sum = -1;
                    break;
                }
            }
            answer[i] = sum;
        }

        return answer;
    }
}

먼저 해시맵을 선언하여 key값으로 keymap의 문자를, value로 keymap 중에서 그 문자가 가장 빨리 나오는 횟수를 넣어준다.
(이제보니 keymap의 이름부터가 map이었던 것이다..!)

그 다음 targets에서 문자에 따라 눌러야하는 횟수를 더해 담아준다.
만약 문자가 없어 더해지지 않았다면 -1이 담기게 해준다.


내가 너무 시야가 좁은거 아닐까 싶다. 풀기 전에 다각도로 생각해보자!

profile
I live in Seoul, Korea, Handsome

0개의 댓글