์ฝ”๋”ฉ ํ…Œ์ŠคํŠธ/๋ฐฑ์ค€

[๋ฐฑ์ค€] ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(node.js) 1996๋ฒˆ 'ํ”„๋ฆฐํ„ฐ ํ' ๋ฌธ์ œ ํ’€์ด

์šฉ๋‡ฝ 2022. 1. 6. 10:56
๋ฐ˜์‘ํ˜•

๋ฐฑ์ค€ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(node.js) 1996๋ฒˆ ํ”„๋ฆฐํ„ฐ ํ ๋ฌธ์ œ ํ’€์ด

๐Ÿ“– ๋“ค์–ด๊ฐ€๋ฉฐ

์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ(nodejs)๋กœ ๋ฐฑ์ค€ 1966๋ฒˆ ๋ฌธ์ œ์ธ ํ ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ 'ํ”„๋ฆฐํ„ฐ ํ' ๋ฌธ์ œ๋ฅผ ํ’€์ดํ•ด๋ณด๊ฒ ๋‹ค.

โ“ ๋ฌธ์ œ 

๋ฌธ์ œ ์„ค๋ช…

์—ฌ๋Ÿฌ๋ถ„๋„ ์•Œ๋‹ค์‹œํ”ผ ์—ฌ๋Ÿฌ๋ถ„์˜ ํ”„๋ฆฐํ„ฐ ๊ธฐ๊ธฐ๋Š” ์—ฌ๋Ÿฌ๋ถ„์ด ์ธ์‡„ํ•˜๊ณ ์ž ํ•˜๋Š” ๋ฌธ์„œ๋ฅผ ์ธ์‡„ ๋ช…๋ น์„ ๋ฐ›์€ ‘์ˆœ์„œ๋Œ€๋กœ’, ์ฆ‰ ๋จผ์ € ์š”์ฒญ๋œ ๊ฒƒ์„ ๋จผ์ € ์ธ์‡„ํ•œ๋‹ค. ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋ฌธ์„œ๊ฐ€ ์Œ“์ธ๋‹ค๋ฉด Queue ์ž๋ฃŒ๊ตฌ์กฐ์— ์Œ“์—ฌ์„œ FIFO - First In First Out - ์— ๋”ฐ๋ผ ์ธ์‡„๊ฐ€ ๋˜๊ฒŒ ๋œ๋‹ค.
ํ•˜์ง€๋งŒ ์ƒ๊ทผ์ด๋Š” ์ƒˆ๋กœ์šด ํ”„๋ฆฐํ„ฐ๊ธฐ ๋‚ด๋ถ€ ์†Œํ”„ํŠธ์›จ์–ด๋ฅผ ๊ฐœ๋ฐœํ•˜์˜€๋Š”๋ฐ, ์ด ํ”„๋ฆฐํ„ฐ๊ธฐ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์กฐ๊ฑด์— ๋”ฐ๋ผ ์ธ์‡„๋ฅผ ํ•˜๊ฒŒ ๋œ๋‹ค.
  1. ํ˜„์žฌ Queue์˜ ๊ฐ€์žฅ ์•ž์— ์žˆ๋Š” ๋ฌธ์„œ์˜ ‘์ค‘์š”๋„’๋ฅผ ํ™•์ธํ•œ๋‹ค.
  2. ๋‚˜๋จธ์ง€ ๋ฌธ์„œ๋“ค ์ค‘ ํ˜„์žฌ ๋ฌธ์„œ๋ณด๋‹ค ์ค‘์š”๋„๊ฐ€ ๋†’์€ ๋ฌธ์„œ๊ฐ€ ํ•˜๋‚˜๋ผ๋„ ์žˆ๋‹ค๋ฉด, ์ด ๋ฌธ์„œ๋ฅผ ์ธ์‡„ํ•˜์ง€ ์•Š๊ณ  Queue์˜       ๊ฐ€์žฅ ๋’ค์— ์žฌ๋ฐฐ์น˜ ํ•œ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๋ฉด ๋ฐ”๋กœ ์ธ์‡„๋ฅผ ํ•œ๋‹ค.
์˜ˆ๋ฅผ ๋“ค์–ด Queue์— 4๊ฐœ์˜ ๋ฌธ์„œ(A B C D)๊ฐ€ ์žˆ๊ณ , ์ค‘์š”๋„๊ฐ€ 2 1 4 3 ๋ผ๋ฉด C๋ฅผ ์ธ์‡„ํ•˜๊ณ , ๋‹ค์Œ์œผ๋กœ D๋ฅผ ์ธ์‡„ํ•˜๊ณ  A, B๋ฅผ ์ธ์‡„ํ•˜๊ฒŒ ๋œ๋‹ค.
์—ฌ๋Ÿฌ๋ถ„์ด ํ•  ์ผ์€, ํ˜„์žฌ Queue์— ์žˆ๋Š” ๋ฌธ์„œ์˜ ์ˆ˜์™€ ์ค‘์š”๋„๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ์–ด๋–ค ํ•œ ๋ฌธ์„œ๊ฐ€ ๋ช‡ ๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜๋Š”์ง€ ์•Œ์•„๋‚ด๋Š” ๊ฒƒ์ด๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์œ„์˜ ์˜ˆ์—์„œ C๋ฌธ์„œ๋Š” 1๋ฒˆ์งธ๋กœ, A๋ฌธ์„œ๋Š” 3๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜๊ฒŒ ๋œ๋‹ค.

์ž…๋ ฅ

  • ์ฒซ ์ค„์— ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ์ˆ˜๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ํ…Œ์ŠคํŠธ์ผ€์ด์Šค๋Š” ๋‘ ์ค„๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
  • ํ…Œ์ŠคํŠธ์ผ€์ด์Šค์˜ ์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ฌธ์„œ์˜ ๊ฐœ์ˆ˜ N(1 ≤ N ≤ 100)๊ณผ, ๋ช‡ ๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜์—ˆ๋Š”์ง€ ๊ถ๊ธˆํ•œ ๋ฌธ์„œ๊ฐ€ ํ˜„์žฌ Queue์—์„œ ๋ช‡ ๋ฒˆ์งธ์— ๋†“์—ฌ ์žˆ๋Š”์ง€๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ M(0 ≤ M < N)์ด ์ฃผ์–ด์ง„๋‹ค. ์ด๋•Œ ๋งจ ์™ผ์ชฝ์€ 0๋ฒˆ์งธ๋ผ๊ณ  ํ•˜์ž. ๋‘ ๋ฒˆ์งธ ์ค„์—๋Š” N๊ฐœ ๋ฌธ์„œ์˜ ์ค‘์š”๋„๊ฐ€ ์ฐจ๋ก€๋Œ€๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ค‘์š”๋„๋Š” 1 ์ด์ƒ 9 ์ดํ•˜์˜ ์ •์ˆ˜์ด๊ณ , ์ค‘์š”๋„๊ฐ€ ๊ฐ™์€ ๋ฌธ์„œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ์ˆ˜๋„ ์žˆ๋‹ค.

์ถœ๋ ฅ

๊ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์— ๋Œ€ํ•ด ๋ฌธ์„œ๊ฐ€ ๋ช‡ ๋ฒˆ์งธ๋กœ ์ธ์‡„๋˜๋Š”์ง€ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1

3
1 0
5
4 2
1 2 3 4
6 0
1 1 9 1 1 1

์˜ˆ์ œ ์ถœ๋ ฅ 1

1
2
5

๐Ÿ’ก ํ’€์ด

๋ฌธ์ œ์—์„œ ์ˆœ์„œ๋Œ€๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค๋Š” ๋ฌธ์žฅ์„ ๋ณด๊ณ  ์ฆ‰,  FIFO 'ํ' ์ž๋ฃŒ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฌธ์ œ์ธ ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค.

์ฒซ ๋ฒˆ์งธ๋กœ๋Š” 3๊ฐœ์˜ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ ์œ„ํ•ด์„œ ์ž…๋ ฅ ๊ฐ’์„ ๋ฐ›๊ณ  ๋ฐ˜๋ณต๋ฌธ ์•ˆ์— ์†”๋ฃจ์…˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋ฉด์„œ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค์˜ ๊ฐœ์ˆ˜๋งŒํผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ฃผ์—ˆ๋‹ค.

const fs = require('fs');
const file = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(file).toString().trim().split('\n');

let [n, ...arr] = input;
arr = arr.map((item) => item.split(' ').map(Number));
let answer = '';

for (let i = 0; i < arr.length; i += 2) {
  let count = 0;
  const priorities = arr[i + 1];
  let location = arr[i][1];
  ...
}

console.log(answer.trim());

์ดํ›„์—, while๋ฌธ์œผ๋กœ ์•Œ๊ณ ์žํ•˜๋Š” ํ”„๋ฆฐํ„ฐ์˜ ์ˆœ์„œ๋ฅผ ์•Œ ๋•Œ๊นŒ์ง€ ๋ฐ˜๋ณต๋ฌธ์„ ์‹คํ–‰ํ•˜๋„๋ก ํ–ˆ๋‹ค.

while๋ฌธ ์•ˆ์—์„œ๋Š” ์ œ์ผ ์ค‘์š”๋„๊ฐ€ ๋†’์€ ํ”„๋ฆฐํ„ฐ๋ฅผ max ๋ณ€์ˆ˜์— ๋‹ด์•„๋‘๊ณ ,

์ฒซ ๋ฒˆ์งธ๋กœ ๋“ค์–ด๊ฐ€ ์žˆ๋Š” ํ”„๋ฆฐํ„ฐ๋ฅผ ๋ฝ‘์•„์„œ ํ•ด๋‹น ํ”„๋ฆฐํ„ฐ๊ฐ€ ์ค‘์š”๋„๊ฐ€ ์ œ์ผ ๋†’์€ ํ”„๋ฆฐํ„ฐ์ธ์ง€ ๋น„๊ต๋ฅผ ํ•˜๋Š”๋ฐ, ํ•ด๋‹น ํ”„๋ฆฐํ„ฐ๊ฐ€ ์ค‘์š”๋„๊ฐ€ ์ œ์ผ ๋†’์€ ํ”„๋ฆฐํ„ฐ๋ผ๋ฉด count๋ฅผ ์˜ฌ๋ฆฌ๋ฉด์„œ ๋ช‡ ๋ฒˆ์งธ๋กœ ๋ฝ‘ํ˜”๋Š”์ง€ ๊ฒฐ๊ณผ๋ฅผ ์ €์žฅํ•˜๊ณ , ๊ทธ ์•ˆ์—์„œ๋„ ์ค‘์š”๋„๊ฐ€ ๋†’๊ณ  ๊ฐ™์€ ํ”„๋ฆฐํ„ฐ๊ฐ€ ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋‹ˆ ์ฐพ๊ณ ์ž ํ–ˆ๋˜ ํ”„๋ฆฐํ„ฐ์˜ ์œ„์น˜๊ฐ€ 0๋ฒˆ ์ธ๋ฑ์Šค ์ฆ‰, ํ˜„์žฌ ๋ฝ‘์€ ํ”„๋ฆฐํ„ฐ๊ฐ€ ๋งž๋‹ค๋ฉด answer์— count๋ฅผ ์ถ”๊ฐ€ํ•˜๊ณ  while๋ฌธ์„ ๋น ์ ธ๋‚˜๊ฐˆ ์ˆ˜ ์žˆ๋„๋ก break๋ฅผ ๊ฑธ์–ด์ฃผ์—ˆ๋‹ค.

 

ํ•˜์ง€๋งŒ ํ˜„์žฌ ๋ฝ‘์€ ํ”„๋ฆฐํ„ฐ๊ฐ€ ์ œ์ผ ์ค‘์š”๋„๊ฐ€ ๋†’์€ ํ”„๋ฆฐํ„ฐ๊ฐ€ ์•„๋‹ˆ๋ผ๋ฉด ํ•ด๋‹น ํ”„๋ฆฐํ„ฐ์˜ ์ˆœ์„œ๋ฅผ ๋งจ ๋’ค๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๊ฒŒ ๋” push๋ฅผ ํ•ด์ฃผ์—ˆ๋‹ค.

 

ํ•ด๋‹น ์ฝ”๋“œ๋“ค์„ ์ง€๋‚˜ ์™”์œผ๋ฉด ์ฐพ๊ณ ์ž ํ•˜๋Š” ํ”„๋ฆฐํ„ฐ์˜ ์œ„์น˜๊ฐ€ ์•ž์œผ๋กœ ๋ฐ€๋ฆฌ๋ฏ€๋กœ ์œ„์น˜๋ฅผ ๋ณ€๊ฒฝํ•ด ์ฃผ์–ด์•ผ ํ•œ๋‹ค.

ํ•ด๋‹น ์œ„์น˜๊ฐ€ 0๋ฒˆ์งธ ์ธ๋ฑ์Šค์˜€๋‹ค๋ฉด ๋งˆ์ง€๋ง‰ ์ธ๋ฑ์Šค๋กœ ๋ณ€๊ฒฝํ•ด์ฃผ๊ณ , ์•„๋‹ˆ๋ฉด -1์„ ํ•จ์œผ๋กœ์จ ์œ„์น˜๋ฅผ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ๋‹ค.

 

๋ชจ๋“  ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ๋‚˜๋ฉด ๋งˆ์ง€๋ง‰์— ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

ํ’€์ด ์ฝ”๋“œ

const fs = require('fs');
const file = process.platform === 'linux' ? '/dev/stdin' : './input.txt';
const input = fs.readFileSync(file).toString().trim().split('\n');

let [n, ...arr] = input;
arr = arr.map((item) => item.split(' ').map(Number));
let answer = '';

for (let i = 0; i < arr.length; i += 2) {
  let count = 0;
  const priorities = arr[i + 1];
  let location = arr[i][1];

  while (true) {
    const max = Math.max(...priorities);
    const number = priorities.shift();
    if (number === max) {
      count++;
      if (location === 0) {
        answer += count + '\n';
        break;
      }
    } else {
      priorities.push(number);
    }

    if (location === 0) {
      location = priorities.length - 1;
    } else {
      location--;
    }
  }
}

console.log(answer.trim());

โœ” ์ฑ„์ 

์ œ์ถœ ๊ฒฐ๊ณผ

๋ฐ˜์‘ํ˜•