2차 공부/알고리즘

대충 만든 자판

공대탈출 2024. 6. 21. 14:48

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

 

어떤 버튼을 반복해서 누르면 keymap의 각 요소대로 순서대로 나온다. (스마트폰 천지인 자판, 피쳐폰 자판)

이때 targets의 각 요소마다 몇번의 자판누름이 필요할지 각각 배열에 넣어 리턴하는 함수를 만드는 것이다.

다만, keymap 배열로 만들 수 없는 targets요소가 있다면, -1을 리턴해야한다.

 

 

처음엔 keymap의 요소를 모두 split시키고, 반복문에따라 targets의 각 요소를 split시켜 비교해 결과를 낼 생각이었다.

하지만 코드를 작성하면서 이게 맞나 싶었다. keymap과 targets 배열의 요소가 각각 100개까지 가능했고, 각 원소의 길이도 100까지 가능했기 때문이다.

비교하는 과정과 계속 split을 시켜야하는 부분에서 시간적으로 손해일것으로 생각하여 Map을 사용하기로 했다.

 

 

내가 작성한 코드

function solution(keymap, targets) {
    var answer = [];
    const map = new Map()
    
    for (const key of keymap) {
        for (let i = 0; i<key.length; i++) {
            if (!map.has(key[i]) || i+1<map.get(key[i])){
                map.set(key[i], i+1)
            }
        }
    }
    
    for (const target of targets) {
        let flag = true;
        let count = 0;
        for (let j = 0; j<target.length; j++) {
            if (!map.has(target[j])) {
                flag = false;
                break;
            } else {
            count+= map.get(target[j])
            }
        }
        flag ? answer.push(count) : answer.push(-1);
    }
    
    return answer;
}

 먼저 Map객체를 만들어준다.

그리고 keymap의 각 요소를 돌면서, 해당 요소의 글자에 대해 판별한다.

만약 map에 해당 key값의 특정 글자가 없거나 key값의 값이 해당 글자번호보다 크다면

map에 해당 알파벳을 새로 지정해준다.

 

그렇게 모든 keymap을 분석해준뒤 targets배열을 분석한다.

상태를 판별할 flag와 눌러야하는 횟수를 기록할 count 변수를 각 target마다 초기화 되도록 만들고,

targets 의 target마다의 알파벳을 분석하는데, 만약 target의 특정 알파벳이 map에 존재하지않는다면, flag를 false로 만들고 해당 분석을 마친다.

flag의 상태에 따라 true일경우엔 count를 answer에 넣고 false일 경우엔 -1을 넣어준다.

만약 map에 target의 모든 알파벳이 존재할 경우엔 map.get으로 쌓아둔 모든 count가 answer에 들어가게된다.

 


이전에 문자열에따라 이미지를 보여줘야하는 작업을 했었는데, 그때 Map객체를 만들어 했던것으로 기억한다.

"샤워장"이라는 문자가 서버로부터 받아와지면, 사용자에게 알맞은 아이콘을 보여 장소에 샤워장이 있다는 것을 직관적으로 알리기 위한 기능이었다.

그때도 Map을 사용했었는데, 사용법이 기억이 안나 어지러웠다

'2차 공부 > 알고리즘' 카테고리의 다른 글

성격 유형 검사하기  (0) 2024.06.27
햄버거 만들기  (0) 2024.06.25
체육복  (0) 2024.06.19
숫자짝꿍  (0) 2024.06.18
옹알이(2)  (0) 2024.06.17