[프로그래머스] Lv3. 표 편집- JavaScript

이상돈·2023년 9월 27일
0
post-thumbnail

문제분류 : 코팅테스트 연습

난이도 : Level 3

출처 : 프로그래머스 - 표 편집

문제

📌 내가 생각한 풀이

양방향 LinkedList를 이용하여 문제를 풀자.
지워진 표가 마지막 표인지 첫번째 표인지, 중간에 있는 표인지 확인하고 코드를 짜자.
class linkedList {
  constructor(idx, node) {
    this.idx = idx;
    this.prev = node;
    this.back;
  }
}

function solution(n, k, cmd) {
  var answer = new Array(n).fill("O");
  let root = new linkedList(0);
  let prevNode = root;
  let currentNode = root;
  for (var i = 1; i < n; i++) {
    const cur = new linkedList(i, prevNode);
    prevNode.back = cur;
    prevNode = cur;
    if (i === k) currentNode = cur;
  }
  let trash = [];
  cmd.forEach(data => {
    let [command, num] = data.split(" ");
    let count = 0;
    switch (command) {
      case "U":
        while (count < num && currentNode.prev) {
          currentNode = currentNode.prev;
          count++;
        }
        break;
      case "D":
        while (count < num && currentNode.back) {
          currentNode = currentNode.back;
          count++;
        }
        break;
      case "C":
        trash.push(currentNode);
        let prev = currentNode.prev;
        let back = currentNode.back;
        if (prev && back) {
          prev.back = back;
          back.prev = prev;
          currentNode = back;
        } else if (prev) {
          prev.back = null;
          currentNode = prev;
        } else if (back) {
          back.prev = null;
          currentNode = back;
        }
        break;
      case "Z":
        let popNode = trash.pop();
        let prevNode = popNode.prev;
        let backNode = popNode.back;
        if (prevNode) {
          prevNode.back = popNode;
        }
        if (backNode) {
          backNode.prev = popNode;
        }
        break;
    }
  });
  trash.forEach(d => {
    answer[d.idx] = "X";
  });
  return answer.join("");
}

📌 느낀점

class를 사용하여 linkedlist를 직접 구현해주었다. linkedlist를 사용할 시 지워진 표를 다시 거치지 않아도 된다는 점에서 효율성을 따지는 문제였다.

profile
사람들의 더 나은 삶을 위한 개발자

0개의 댓글