๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ”‘ ์•Œ๊ณ ๋ฆฌ์ฆ˜/๋ฐฑ์ค€ JS

[๋ฐฑ์ค€] node.js/ 2164 ์นด๋“œ2

by Tamii 2021. 10. 13.
๋ฐ˜์‘ํ˜•

์ฒ˜์Œ ํ’€์ด (์‹œ๊ฐ„ ์ดˆ๊ณผ)

const fs = require('fs');

let input = (fs.readFileSync('./test') + '').toString().trim();

const numArr = Array.from({ length: parseInt(input) }, (v, i) => i + 1);

while (numArr.length > 1) {
  numArr.shift();
  numArr.push(numArr.shift());
}

console.log(numArr[0]);

๋ฐฐ์—ด์„ ๋Œ๋ฉฐ ๊ธธ์ด๊ฐ€ 1์ด๋ ๋•Œ๊นŒ์ง€

1. ์ฒซ ๋ฒˆ์งธ ๊ฐ’ ์ œ๊ฑฐ

2. ์ฒซ ๋ฒˆ์งธ ๊ฐ’ ๋’ค๋กœ ๋ถ™์ด๊ธฐ

๋ฐ˜๋ณตํ–ˆ์ง€๋งŒ... ์‹œ๊ฐ„์ดˆ๊ณผ 

 

 

 

๊ฒ€์ƒ‰ํ•ด ๋ณด๋‹ˆ ๋ฐฐ์—ด์˜ push ,pop ์„ ์ด์šฉํ•˜๋ฉด ์‹œ๊ฐ„์ดˆ๊ณผ๊ฐ€ ๋œฌ๋‹ค๊ณ  ํ•œ๋‹ค.

๋ฐฐ์—ด์˜ ์—ฐ์‚ฐ์‹œ๊ฐ„์ƒ  ๋งจ ์•ž ์š”์†Œ์˜ ์‚ญ์ œ & ์ถ”๊ฐ€ํ•˜๋Š” ์—ฐ์‚ฐ์ด index ์ˆ˜์ •์‹œ๊ฐ„ํ•˜๋Š” ์‹œ๊ฐ„์ด๋‚˜ ๋‹ค๋ฆ„์—†๊ธฐ ๋•Œ๋ฌธ์—

์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค์–ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๋Š” ํ’€์ด@!!

 

ํŒŒ์ด์ฌ์œผ๋กœ ํ•  ๋• ์ด๋Ÿฐ๊ฑฐ ์—†์—ˆ๋Š”๋ฐ ..์—‰์—‰ 

 

JS๋Š” ์—ฐ๊ฒฐ๋ฆฌ์ŠคํŠธ๊ฐ€ ์—†์–ด์„œ ์ง์ ‘ ๋งŒ๋“ค์–ด์ฃผ๋ฉด ๋œ๋‹จ๋‹ค~~ ์‹ ๋‚œ๋‹น!!

 

 

 


๐Ÿค”  ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ? 

๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋Š” ๋…ธ๋“œ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๊ณ  val, ref,add ์ €์žฅํ•˜๋Š” ๊ณต๊ฐ„์ด ์žˆ์Œ

- find ๋ฅผ ์œ„ํ•ด์„œ๋Š” ์‹œ๊ฐ„๋ณต์žก๋„ O(n)

- random access๋ฅผ ์œ„ํ•ด์„œ๋Š” head์—์„œ๋ถ€ํ„ฐ ๋ฌด์กฐ๊ฑด ์‹œ์ž‘ํ•ด ๊ฐ๊ฐ์˜ node๋ฅผ ํƒ์ƒ‰ํ•ด์•ผ ํ•จ

- ํ•œ ์ชฝ ๋ฐฉํ–ฅ์œผ๋กœ๋งŒ ์—ฐ๊ฒฐ๋˜์–ด์žˆ์œผ๋ฉด : singly linked list  ์–‘์ชฝ ๋ฐฉํ–ฅ : doubly linked list (prev ๋ฐฉํ–ฅ์œผ๋กœ๋„ ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•จ)

 

 

๊ทธ๋ ‡๋‹ด ์ด ๋ฌธ์ œ๋ฅผ ํ’€๊ธฐ ์œ„ํ•ด์„œ๋Š”

๋ฐฐ์—ด์ฒ˜๋Ÿผ ๊ฐ’์„ ๋นผ๊ณ  ๋„ฃ์„๋•Œ๋งˆ๋‹ค ์ธ๋ฑ์Šค๋ฅผ ์ƒˆ๋กœ๊ณ„์‚ฐํ•˜์ง€ ์•Š์•„๋„ ๋˜๋Š”  ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ๋ฅผ ์ง์ ‘๊ตฌํ˜„ํ•ด์•ผ ํ•œ๋‹ค!

 

 

 

โค๏ธ  nodejs ๋งํฌ๋“œ๋ฆฌ์ŠคํŠธ

๐Ÿ”— ์ฐธ๊ณ ๋ธ”๋กœ๊ทธ

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

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

  add(value) {
    const newNode = new Node(value);

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

    this.tail = newNode;
    this._size++;

    return newNode;
  }

  getHead() {
    return this.head.value;
  }

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

  getSize() {
    return this._size;
  }
}

1. Node ํด๋ž˜์Šค ์ƒ์„ฑ ( ๊ฐ’ , ๋‹ค์Œ๊ฐ’ , ์ด์ „๊ฐ’ )

2. LinkedList ํด๋ž˜์Šค ์ƒ์„ฑ ( ํ—ค๋“œ , ๊ผฌ๋ฆฌ, ํฌ๊ธฐ)

3. ๋ฉ”์„œ๋“œ ์ƒ์„ฑ 

 - add : ๊ฐ’ ์ถ”๊ฐ€

 - getHead : ํ˜„์žฌ ํ—ค๋“œ ์–ป๊ธฐ

 - removeHead : ํ—ค๋“œ ์ œ๊ฑฐ

 - getSize : ํ˜„์žฌ ์‚ฌ์ด์ฆˆ

 

 

new cards

LinkedList { head: null, tail: null, _size: 0 }

์ดˆ๊ธฐํ™” cards

LinkedList {
  head: <ref *1> Node {
    value: 1,
    next: Node { value: 2, next: [Node], prev: [Circular *1] },
    prev: null
  },
  tail: <ref *2> Node {
    value: 6,
    next: null,
    prev: Node { value: 5, next: [Circular *2], prev: [Node] }
  },
  _size: 6
}

1~6์˜ ์ˆซ์ž๊ฐ€ ์ฑ„์›Œ์ ธ์žˆ๊ณ  ์„œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ์Œ (1-2-3-4-5-6)

 

 


 

 

 

 

 

 

๋‹ค์Œ ํ’€์ด

const fs = require('fs');

let input = (fs.readFileSync('./test') + '').toString().trim();



const cards = new LinkedList();


for (let i = 1; i <= input; i++) {
  cards.add(i);
}


while (cards.getSize() !== 1) {
  cards.removeHead();
  cards.add(cards.getHead());
  cards.removeHead();
}

console.log(cards.getHead());

 

 

๋Œ“๊ธ€