코딩테스트 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을 변경해서 삭제를 했다고 가정하는 방식으로 이해하면 될 것 같다.