코딩 테스트

프로그래머스) 대충 만든 자판 Lv1

우루쾅 2024. 2. 4. 23:00
728x90
반응형
SMALL

지난 문제만 어려운줄 알았는데 이번거도 쉽지않다;;

1래벨이 어려운건지 아님 내가 못하는건지....

 

키보드의 자판순서를 위한 for문, targets를 비교하기위한 for문, 순서대로 처리하기 위한 for문 3개를 만들다보니

너무 어지럽고 정신없어서 처음부터 다시 코딩했다

(실패한 흔적 ↓ )

import java.util.*;

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];
        int chk = 0;
        
        for(int i=0; i<targets.length; i++){
            String tg[] = targets[i].split("");
            
            for(int j=0; j<keymap.length; j++){
                String km[] = keymap[j].split("");
                for(int z=0; z<tg.length; z++){
                    if(tg[i].equals(km[j])){
                        chk++;
                    }   
                }
            }
            if(chk == 0) chk = -1;
            answer[i] = chk;
            chk = 0;
        }
        
        return answer;
    }
}

 

정신없이 헤메다가 힌트!(질문하기)를 봤다

 

질문하기에서 정신없이 정보를 얻을데 없나 찾던 중 엄탱님의 개발 블로그를 봤다.(출처)

 

세상은 넓고 천재들은 많구나...(아님 내가 우물안 개구리?!)

문제를 풀 때 생각치 못한 부분으로 풀어내는 것에 놀랐고 바로 구독과 댓글을 달아버렸다

 

나는 문제를 해결하기 위해서 targets 의 데이터를 분석하기에 급급했는데,

이 해설에서는 기준점이 되는 키보드인 keymap 에 기준값을 셋팅하고 이후에 targets 을 통해 정답을 뽑아냈다.

 

이 문제는 직접 풀기보다 참고하고 배운 문제이기 때문에 나중에 다시 풀어봐야겠다....

 

 

 

 


정답

import java.util.*;

class Solution {
    public int[] solution(String[] keymap, String[] targets) {
        int[] answer = new int[targets.length];
        Map<Character, Integer> map = new HashMap<>();
        int ans = 0;
        
        for(String s : keymap){
            for(int i=0; i<s.length(); i++){
                char key = s.charAt(i);
                // keymap의 전체 알파벳에 숫자를 매김
                // Math.min 에서 예를 들어 ABACD 이면 B를 입력하기위해서는 
                // 자판을 두번 눌러야되기 때문에 2 이고 이것 때문에 i+1 을 해줌
                // map.getOrDefault(key, 10000)는 map에서 
                // key 값이 있으면 해당 숫자를 불러오고 없으면 뒤에 숫자를 넣어주는데
                // Math.min 에서 둘 중 작은 숫자를 뽑아내기 때문에 10000 값이 들어갈 일은 없다.
                map.put(key, Math.min(i+1, map.getOrDefault(key, 10000 )));
            }
        }
        
        // 여기에서는 target에서 각각 알파벳마다 char 을 통해
        // map으로 키값을 얻어오면 된다.
        for(int i=0; i<targets.length; i++){
            for(int j=0; j<targets[i].length(); j++){
                char tg = targets[i].charAt(j);
                if(map.containsKey(tg)){
                    answer[i] += map.get(tg);
                }else{
                    answer[i] = -1;
                    break;
                }
            }
        }
        
        return answer;
    }
}

 

 

출처

프로그래머스 - https://school.programmers.co.kr/learn/courses/30/lessons/160586

엄탱 개발 블로그 -https://tang25.tistory.com/entry/%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8%EC%8A%A4-%EB%8C%80%EC%B6%A9-%EB%A7%8C%EB%93%A0-%EC%9E%90%ED%8C%90-Lv1-JAVA-%ED%95%B4%EC%8B%9C%EC%97%84%ED%83%B1

 

728x90
반응형
LIST