[programmers] Lv3. 表の編集|二重接続リスト|protect-me

26066 ワード

🕊 Link


Lv3. 表Javascriptの編集
https://programmers.co.kr/learn/courses/30/lessons/81303

🧑🏻‍💻 Code(javascript)

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
}

💡 Solution

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
}

👨‍👦‍👦 Others

👨🏻‍💻💭 Self Feedback


1寸の時期に順番に解くことに失敗した
二重接続リストに再挑戦します.
  • 22021.09.10-
  • が最初に作成されました.댓글 환영 질문 환영 by.protect-me