Lv3. 표 편집 Javascript
https://programmers.co.kr/learn/courses/30/lessons/81303
class Node {
constructor(value, prev, next) {
this.value = value
this.prev = prev
this.next = next
this.status = 'O'
}
}
function solution(n, k, cmd) {
const stack = []
const nodes = Array.from({ length: n }, (_, i) => new Node(i))
for (let i = 0; i < n; i++) {
nodes[i].prev = nodes[i - 1] || null
nodes[i].next = nodes[i + 1] || null
}
let cur = nodes[k]
cmd.forEach(command => {
const [char, num] = command.split(" ")
let prevNode = null
let nextNode = null
switch (char) {
case "U":
for (let i = 0; i < num; i++) {
cur = cur.prev
}
break;
case "D":
for (let i = 0; i < num; i++) {
cur = cur.next
}
break;
case "C":
const removedNode = cur
prevNode = cur.prev
nextNode = cur.next
if (prevNode && nextNode) {
cur.prev.next = removedNode.next
cur.next.prev = removedNode.prev
cur = removedNode.next
} else if (!prevNode && nextNode) {
cur.next.prev = null
cur = removedNode.next
} else if (prevNode && !nextNode) {
cur.prev.next = null
cur = removedNode.prev
}
removedNode.status = 'X'
stack.push(removedNode)
break;
case "Z":
const restoredNode = stack.pop()
prevNode = restoredNode.prev
nextNode = restoredNode.next
if (prevNode) prevNode.next = restoredNode
if (nextNode) nextNode.prev = restoredNode
restoredNode.status = 'O'
break;
}
})
let answer = ""
for (let i = 0; i < nodes.length; i++) {
answer += nodes[i].status
}
return answer
}
class Node {
constructor(value, prev, next) {
this.value = value
this.prev = prev
this.next = next
this.status = 'O'
}
}
function solution(n, k, cmd) {
const stack = []
const nodes = Array.from({ length: n }, (_, i) => new Node(i))
// 길이 n짜리 배열을 만들고 각 자리를 index를 value로 넣은 node로 mapping
for (let i = 0; i < n; i++) {
nodes[i].prev = nodes[i - 1] || null
nodes[i].next = nodes[i + 1] || null
}
// prev와 next를 각각 세팅해주는데,
// 첫번쨰 노드의 prev와 마지막 노드의 next를 위해 `|| null` 추가
let cur = nodes[k] // 현재 위치 cur을 세팅
cmd.forEach(command => { // cmd의 요소를 순차적으로 돌면서,
const [char, num] = command.split(" ")
// command를 " "(공백) 기준으로 나누어 char, num에 세팅
let prevNode = null
let nextNode = null
switch (char) { // char를 기준으로 switch 분기
case "U":
for (let i = 0; i < num; i++) {
cur = cur.prev
} // cur 기준, num만큼 prev이동
break;
case "D":
for (let i = 0; i < num; i++) {
cur = cur.next
} // cur 기준, num만큼 next이동
break;
case "C":
const removedNode = cur
prevNode = cur.prev
nextNode = cur.next
if (prevNode && nextNode) { // 둘다 있는 경우
// cur의 prev과 next를 연결
cur.prev.next = removedNode.next
cur.next.prev = removedNode.prev
cur = removedNode.next // 자리는 하나씩 밀려 올라오기 때문에 next로 세팅
} else if (!prevNode && nextNode) { // prev가 없는 경우
// cur과 next의 연결을 해제
cur.next.prev = null
cur = removedNode.next // 자리는 next로 세팅
} else if (prevNode && !nextNode) { // next가 없는 경우
// prev와 next의 연결을 끊음
cur.prev.next = null
cur = removedNode.prev // next가 없기 때문에 자리는 prev로 세팅
}
removedNode.status = 'X' // 삭제된 노드의 status를 변경
stack.push(removedNode) // 삭제된 노드를 stack에 push
break;
case "Z":
// 복원할 node를 stack에서 pop으로 가져옴(후입선출)
const restoredNode = stack.pop()
prevNode = restoredNode.prev
nextNode = restoredNode.next
// 복원할 노드의 prev가 있다면 복원할 노드를 prev의 next로 설정
if (prevNode) prevNode.next = restoredNode
// 복원할 노드의 next가 있다면 복원할 노드를 next의 prev로 설정
if (nextNode) nextNode.prev = restoredNode
restoredNode.status = 'O' // 복원한 노드의 status를 변경
break;
}
})
let answer = ""
for (let i = 0; i < nodes.length; i++) {
answer += nodes[i].status
}
return answer
}
1치 시기에 배열로 풀이했다가 실패.
이중연결리스트로 다시 도전.
댓글 환영
질문 환영
by.protect-me