코딩테스트 by JS

표 편집(LV3) javascript

mickey7 2024. 9. 8. 16:48
function solution(n, k, cmd) {
    var answer = '';
    
    const up = [...Array(n+1)].map((_,i) => i-1)
    const down = [...Array(n+1)].map((_,i) => i+1)
    
    const deleted = [];
    
    k += 1;
    
    for(let item of cmd)
    {
        if(item === "C")
        {
            down[up[k]] = down[k];
            up[down[k]] = up[k];
            deleted.push(k);
            k = n<down[k] ? up[k] : down[k]
        }
        else if(item === "Z")
        {
            let restore = deleted.pop();
            up[down[restore]] = restore;
            down[up[restore]] = restore;
        }else{
            let [move, num] = item.split(" ");
            if(move === "D"){
                for(let i=0; i<num; i++){
                    k = down[k]
                }
            }else if(move ==="U"){
                for(let i=0; i<num; i++){
                    k = up[k]
                }
            }
        }
    }
    
    const res = Array(n).fill("O");
    for(const i of deleted){
        res[i-1] = "X"
    }
    
    return res.join("");
}

 

  • 시간 복잡도 고려해서 배열을 선언 후에 삽입과 삭제 연산 대신, 인덱스만으로 연산하는 방법

  • k는 현재 위치(index), 두개의 배열을 선언해서 up은 현재 위치에 따라서 가리키는 값을 저장한다
    • 예를들면, up[1] = 0인데 이는 현재 위치 1의 위는 0을 가리킨다고 이해하면되고, down[2] = 3은 현재위치 2일 때의 아래는 3을 가리킨다고 생각하면 된다.
    • 그런데 k의 맨 윗값과 아랫값이 0과 3인데 0의 위와 3의 아랫값을 고려하기 위해서 UP은 -1까지 고려하고 DOWN은 4까지 고려하도록 배열의 크기가 +1 크도록 선언한다.
  • C는 삭제하는 명령어인데 인덱스를 변경하는 방법인 down[up[k]] = down[k]는 처음에 이해하기가 어려울 수 있는데, 말로 풀어서 간단히 설명하자면
    •  현재 위치가 2라고 가정해보자, 현재 위치의 이전값(UP[k])의 다음값[down[up[k]]이 현재 위치의 다음 값(down[k])을 가리키도록해서 현재위치의 이전과 다음이 가리키는 up과 down을 변경해서 삭제를 했다고 가정하는 방식으로 이해하면 될 것 같다.