[๋ฐฑ์ค] ์๋ฐ์คํฌ๋ฆฝํธ(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());
โ ์ฑ์