Bleeding edge

[프로그래머스] [3차] 압축- 자바스크립트 본문

코딩테스트 공부

[프로그래머스] [3차] 압축- 자바스크립트

codevil 2022. 5. 6. 16:52

https://programmers.co.kr/learn/courses/30/lessons/17684

 

코딩테스트 연습 - [3차] 압축

TOBEORNOTTOBEORTOBEORNOT [20, 15, 2, 5, 15, 18, 14, 15, 20, 27, 29, 31, 36, 30, 32, 34]

programmers.co.kr

예전부터 반복문이 이상하게 작동해서.. 5회이상 풀이를 했던 기억이 있다. console.log를 찍어봐도 이해가 안됬는데.. 문제가 되는 반복문을 제외하고, 풀이를 해서 풀이했다. 풀이 플로우는 다음과 같다.

1. 우선 msg를 for문으로 반복문을 만든다.

    for(let i=0;i<msg.length;i++){}

2. 이때, msg[i] + msg[i+1]이 list에 없다면, list에 push를 하고, list에 있다면 msg[i] + msg[i+1]... 을 반복한다.

3. list에 push를 한다면, list push가 되기 이전의 string의 숫자를 구한다

4. string의 숫자는 한글자의 경우에는 charCodeAt() - 64를 넣고, 두글자 이상인 경우에는, list에 포함이 되어 있을테니 list의 index + 27을 더하는 숫자이다.

5. 이 숫자를 answer에 push하면 그게 답이다.

풀이는 다음과 같다.

function solution(msg) {
    const list =[];
    let answer = [];
    const mnum = 64;
    const pnum = 27
    for(let i=0;i<msg.length;i++){
        let now= msg[i];
        let nxt = msg[i];
        while(list.includes(nxt)||nxt.length===1){
            now = nxt;
            nxt = nxt + msg[i+1]
            i++
        }
            i--
        list.push(nxt)
          if(now.length===1){
              answer.push(now.charCodeAt()-mnum)
              
            }else{
                
                answer.push(list.indexOf(now) + pnum)
            }
        
    }
    return answer
}

while문의 i++과 i--부분이.. 그 if 문이 작동이 잘안되서 억지로 넣은 부분이다..ㅠㅠ 이건 나중에 다시풀어보면서 왜 작동이 안하나를 찾아봐야할꺼 같다.