Algorithm/๋ฐฑ์ค€(BOJ)

[JavaScript/BOJ] 2164 - ์นด๋“œ2

_์„ฑํ˜ธ_ 2023. 1. 3. 15:45
728x90
๋ฐ˜์‘ํ˜•

๐Ÿ“Œ ๋ฌธ์ œ

N์žฅ์˜ ์นด๋“œ๊ฐ€ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นด๋“œ๋Š” ์ฐจ๋ก€๋กœ 1๋ถ€ํ„ฐ N๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๊ฐ€ ๋ถ™์–ด ์žˆ์œผ๋ฉฐ, 1๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์œ„์—, N๋ฒˆ ์นด๋“œ๊ฐ€ ์ œ์ผ ์•„๋ž˜์ธ ์ƒํƒœ๋กœ ์ˆœ์„œ๋Œ€๋กœ ์นด๋“œ๊ฐ€ ๋†“์—ฌ ์žˆ๋‹ค.

์ด์ œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋™์ž‘์„ ์นด๋“œ๊ฐ€ ํ•œ ์žฅ ๋‚จ์„ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณตํ•˜๊ฒŒ ๋œ๋‹ค. ์šฐ์„ , ์ œ์ผ ์œ„์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ๋ฐ”๋‹ฅ์— ๋ฒ„๋ฆฐ๋‹ค. ๊ทธ ๋‹ค์Œ, ์ œ์ผ ์œ„์— ์žˆ๋Š” ์นด๋“œ๋ฅผ ์ œ์ผ ์•„๋ž˜์— ์žˆ๋Š” ์นด๋“œ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธด๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด N=4์ธ ๊ฒฝ์šฐ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์ž. ์นด๋“œ๋Š” ์ œ์ผ ์œ„์—์„œ๋ถ€ํ„ฐ 1234 ์˜ ์ˆœ์„œ๋กœ ๋†“์—ฌ์žˆ๋‹ค. 1์„ ๋ฒ„๋ฆฌ๋ฉด 234๊ฐ€ ๋‚จ๋Š”๋‹ค. ์—ฌ๊ธฐ์„œ 2๋ฅผ ์ œ์ผ ์•„๋ž˜๋กœ ์˜ฎ๊ธฐ๋ฉด 342๊ฐ€ ๋œ๋‹ค. 3์„ ๋ฒ„๋ฆฌ๋ฉด 42๊ฐ€ ๋˜๊ณ , 4๋ฅผ ๋ฐ‘์œผ๋กœ ์˜ฎ๊ธฐ๋ฉด 24๊ฐ€ ๋œ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ 2๋ฅผ ๋ฒ„๋ฆฌ๊ณ  ๋‚˜๋ฉด, ๋‚จ๋Š” ์นด๋“œ๋Š” 4๊ฐ€ ๋œ๋‹ค.

N์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ œ์ผ ๋งˆ์ง€๋ง‰์— ๋‚จ๊ฒŒ ๋˜๋Š” ์นด๋“œ๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.

์ž…๋ ฅ ์ถœ๋ ฅ
์ฒซ์งธ ์ค„์— ์ •์ˆ˜ N(1<=N<=500,000)์ด ์ฃผ์–ด์ง„๋‹ค. ์ฒซ์งธ ์ค„์— ๋‚จ๊ฒŒ ๋˜๋Š” ์นด๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

๐Ÿค” ์ฒ˜์Œ์— ์ œ์ถœํ•œ ์†Œ์Šค ์ฝ”๋“œ(์‹œ๊ฐ„ ์ดˆ๊ณผ ๋ฐœ์ƒโ—โ—)

const input = require('fs').readFileSync('/dev/stdin').toString().trim();

function solution(num) {
  const Q = Array.from({ length: num }, (v, i) => (v = i + 1));
  let i = 0;

  while (Q.length > 1) {
    if (i % 2 === 0) {
      Q.shift();
    } else {
      Q.push(Q.shift());
    }

    i++;
  }

  return Q[0];
}

console.log(solution(Number(input)));

 

โ“ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ ์ด์œ 

push, pop์€ O(1)์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€์ง€๋งŒ shift() ๋ฉ”์†Œ๋“œ์˜ ๊ฒฝ์šฐ ๋ฐฐ์—ด์˜ ํƒ์ƒ‰์ด ํ•„์š”ํ•˜๋ฏ€๋กœ ์ตœ์•…์ผ ๋•Œ๋Š” O(N)์˜ ๋ณต์žก๋„๋ฅผ ๊ฐ€์ง€๊ธฐ ๋•Œ๋ฌธ์ด๋‹ค. (JavaScript ๋ฐฐ์—ด์€ ํ•ด์‹œ ํ…Œ์ด๋ธ”๋กœ ๊ตฌํ˜„๋œ ๊ฐ์ฒด์ด๊ธฐ ๋•Œ๋ฌธ)

JavaScript๋Š” Queue ๊ด€๋ จ ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ง์ ‘ ๊ตฌํ˜„ํ•ด์„œ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค. ์ž…๋ ฅ ๊ฐ’์ด 1,000 ์ดํ•˜๋ผ๋ฉด shift() ๋ฉ”์†Œ๋“œ๋ฅผ ์‚ฌ์šฉํ•ด๋„ ๋˜์ง€๋งŒ ๋ฌธ์ œ์—์„œ ์ฃผ์–ด์ง„ ์ž…๋ ฅ ๊ฐ’์˜ ๋ฒ”์œ„๋Š” 500,000 ๊นŒ์ง€์ด๋‹ค..ใ… ใ… 

 

๐Ÿ’ก ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

Queue๋ฅผ ์ง์ ‘ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์€ ๋ฐฉ๋ฒ•์ด์ง€๋งŒ ์‹ค์ œ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ํ…Œ์ŠคํŠธ๋ฅผ ๋ณผ ๊ฒฝ์šฐ์—๋Š” ์‹œ๊ฐ„์— ์ซ“๊ฒจ ์ด๋งˆ์ €๋„ ์‰ฝ์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐ์„ ํ–ˆ๋‹ค. ๊ทธ๋ฆฌํ•˜์—ฌ Queue๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐฉ๋ฒ•์„ ์ƒ๊ฐํ•ด๋ƒˆ๋‹ค.

๋ฐฐ์—ด์˜ ์ฒซ ๋ฒˆ์งธ ์›์†Œ๋ฅผ ์‚ญ์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ธ๋ฑ์Šค๋ฅผ ํ•œ ๋‹จ๊ณ„ ๊ฑด๋„ˆ๋›ฐ๋Š” ๊ฒƒ์ด๋‹ค.

๋‹จ, ๊ณต๊ฐ„ ๋ณต์žก๋„๊ฐ€ ์ฆ๊ฐ€ํ•˜๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค...๐Ÿ˜ข

const input = require('fs').readFileSync('/dev/stdin').toString().trim();

function solution(num) {
  const Q = Array.from({ length: num }, (v, i) => (v = i + 1));
  let idx = 0;

  while (idx !== Q.length - 1) {
    if (idx % 2 === 0) idx++;
    else Q.push(Q[idx++]);
  }

  return Q[idx];
}

console.log(solution(Number(input)));

 

๐Ÿ“š ์ฐธ๊ณ 

 

[JavaScript] Queue ๊ตฌํ˜„ ๋ฐ ์‹œ๊ฐ„ ๋ณต์žก๋„

โœ๏ธ JS์—์„œ Stack. Queue์˜ ์‹œ๊ฐ„ ๋ณต์žก๋„ ํ”ํžˆ ์•Œ๊ณ ์žˆ๋Š” stack, queue๋ฅผ JS์—์„œ ์‚ฌ์šฉํ•˜๋ ค๊ณ  ํ•  ๋•Œ, ๋ณดํ†ต ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•œ๋‹ค. const stack = []; stack.push(1); stack.push(2); console.log(stack[stack.length - 1]); stack.pop();

ghost4551.tistory.com