본문 바로가기
개발 노트/백준, 프로그래머스 풀이

[백준 2164/javascript] 카드2

by tokkiC 2022. 8. 13.

세상에 마상에 끔찍해라

자바스크립트에서는 큐와 스택 등 기본적인 자료구조를 내부 함수로 제공하지 않는다!!!

쓰고 싶으면 직접 구현해서 써야된다. 있는게 뭐야 자바스크립트는!

아오 진짜 못해먹겠네! 자바스크립트!

그나마 자바스크립트의 배열에서 push 와 shift 로 큐처럼 사용할 수 있지만, 배열로 문제 제출시 시간초과가 뜬다

자바스크립트 배열의 경우 shift 는 앞의 요소를 지우고 전체 배열을 하나씩 앞으로 당기는지라 

너무 비효율적이고 시간복잡도가 팍팍 오른다

그래서 다음엔 자바스크립트로 직접 큐를 구현해봤는데

단일 연결 리스트로 구현했더니 연산이 꼬여서 예상치 못한 에러가 발생...

이중 연결 리스트로 구현해서 겨우 풀었다. 이중 연결 리스트로 풀면서 단일 연결리스트에서의 에러 원인도

찾게 되었다. 큐의 메소드로 front() 를 만들었는데, 큐의 속성에도 front 를 넣어 이름이 겹치므로

front 만 사용시에도 front()로 중복된 것이다... 메소드명이 속성이름과 같은지 꼭 확인하자

https://www.acmicpc.net/problem/2164

 

2164번: 카드2

N장의 카드가 있다. 각각의 카드는 차례로 1부터 N까지의 번호가 붙어 있으며, 1번 카드가 제일 위에, N번 카드가 제일 아래인 상태로 순서대로 카드가 놓여 있다. 이제 다음과 같은 동작을 카드가

www.acmicpc.net

const readline = require("readline").createInterface({
  input: process.stdin,
  output: process.stdout,
});

readline.on("line", (line) => {
  input = Number(line);
  readline.close();
});
readline.on("close", () => {
  solution(input);
  process.exit();
});

class Node {
  constructor(data) {
    this.data = data;
    this.prev = null;
    this.next = null;
  }
}

class LinkedList {
  constructor() {
    this.head = null;
    this.tail = null;
    this._size = 0;
  }

  push(data) {
    const newNode = new Node(data);

    if (!this.head) {
      this.head = newNode;
    } else {
      this.tail.next = newNode;
      newNode.prev = this.tail;
    }
    this.tail = newNode;
    this._size++;
  }

  front() {
    return this.head.data;
  }

  pop() {
    this.head = this.head.next;
    this.head.prev = null;
    this._size--;
  }

  size() {
    return this._size;
  }
}

const solution = (n) => {
  const list = new LinkedList();

  for (let i = 1; i <= n; i++) {
    list.push(i);
  }
  while (list.size() !== 1) {
    list.pop();
    list.push(list.front());
    list.pop();
  }
  console.log(list.front());
};

댓글