๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป
article thumbnail
๋ฐ˜์‘ํ˜•

[๋ฐฑ์ค€]5214๋ฒˆ 'ํ™˜์Šน' ๋ฌธ์ œ ํ’€์ด - JavaScript

๋‚œ์ด๋„: ๊ณจ๋“œ 2

ํ’€์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜: BFS

๋ฌธ์ œ

์•„์ฃผ ๋จผ ๋ฏธ๋ž˜์— ์‚ฌ๋žŒ๋“ค์ด ๊ฐ€์žฅ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์ค‘๊ตํ†ต์€ ํ•˜์ดํผํŠœ๋ธŒ์ด๋‹ค. ํ•˜์ดํผํŠœ๋ธŒ ํ•˜๋‚˜๋Š” ์—ญ K๊ฐœ๋ฅผ ์„œ๋กœ ์—ฐ๊ฒฐํ•œ๋‹ค. 1๋ฒˆ์—ญ์—์„œ N๋ฒˆ์—ญ์œผ๋กœ ๊ฐ€๋Š”๋ฐ ๋ฐฉ๋ฌธํ•˜๋Š” ์ตœ์†Œ ์—ญ์˜ ์ˆ˜๋Š” ๋ช‡ ๊ฐœ์ผ๊นŒ?

์ž…๋ ฅ

์ฒซ์งธ ์ค„์— ์—ญ์˜ ์ˆ˜ N๊ณผ ํ•œ ํ•˜์ดํผํŠœ๋ธŒ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญ์˜ ๊ฐœ์ˆ˜ K, ํ•˜์ดํผํŠœ๋ธŒ์˜ ๊ฐœ์ˆ˜ M์ด ์ฃผ์–ด์ง„๋‹ค. (1 ≤ N ≤ 100,000, 1 ≤ K, M ≤ 1000)

๋‹ค์Œ M๊ฐœ ์ค„์—๋Š” ํ•˜์ดํผํŠœ๋ธŒ์˜ ์ •๋ณด๊ฐ€ ํ•œ ์ค„์— ํ•˜๋‚˜์”ฉ ์ฃผ์–ด์ง„๋‹ค. ์ด K๊ฐœ ์ˆซ์ž๊ฐ€ ์ฃผ์–ด์ง€๋ฉฐ, ์ด ์ˆซ์ž๋Š” ๊ทธ ํ•˜์ดํผํŠœ๋ธŒ๊ฐ€ ์„œ๋กœ ์—ฐ๊ฒฐํ•˜๋Š” ์—ญ์˜ ๋ฒˆํ˜ธ์ด๋‹ค. 

์ถœ๋ ฅ

์ฒซ์งธ ์ค„์— 1๋ฒˆ์—ญ์—์„œ N๋ฒˆ์—ญ์œผ๋กœ ๊ฐ€๋Š”๋ฐ ๋ฐฉ๋ฌธํ•˜๋Š” ์—ญ์˜ ๊ฐœ์ˆ˜์˜ ์ตœ์†Ÿ๊ฐ’์„ ์ถœ๋ ฅํ•œ๋‹ค. ๋งŒ์•ฝ, ๊ฐˆ ์ˆ˜ ์—†๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

์˜ˆ์ œ ์ž…๋ ฅ 1 

9 3 5
1 2 3
1 4 5
3 6 7
5 6 7
6 8 9

 

1-3-6-9๋‚˜ 1-5-6-9๋กœ ์ด๋™ํ•˜๋ฉด ๋œ๋‹ค.

์˜ˆ์ œ ์ถœ๋ ฅ 1 

4

๋ฐ˜์‘ํ˜•

๐Ÿ‘‰ ํ’€์ด ์ฝ”๋“œ

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

class Queue {
  constructor() {
    this.items = {};
    this.headIndex = 0;
    this.tailIndex = 0;
  }

  enqueue(item) {
    this.items[this.tailIndex] = item;
    this.tailIndex++;
  }

  dequeue() {
    const item = this.items[this.headIndex];
    delete this.items[this.headIndex];
    this.headIndex++;
    return item;
  }

  peek() {
    return this.items[this.headIndex];
  }

  size() {
    return this.tailIndex - this.headIndex;
  }
}

const [n, k, m] = input[0].split(' ').map(Number);
const graph = Array.from({ length: n + m + 1 }, () => []);
for (let i = 1; i <= m; i++) {
  const arr = input[i].split(' ').map(Number);
  for (const x of arr) {
    graph[x].push(n + i);
    graph[n + i].push(x);
  }
}
const visited = new Set([1]);
const queue = new Queue();
queue.enqueue([1, 1]);

while (queue.size() !== 0) {
  const [dist, now] = queue.dequeue();

  if (now === n) {
    console.log(Math.floor(dist / 2) + 1);
    return;
  }

  for (const y of graph[now]) {
    if (!visited.has(y)) {
      visited.add(y);
      queue.enqueue([dist + 1, y]);
    }
  }
}

console.log(-1);

๐Ÿ’กํ’€์ด ํ•ด์„ค

์ผ์ข…์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ๋ฌธ์ œ์ด๋ฉฐ, ๊ฐ„์„ ์˜ ๋น„์šฉ์ด ๋™์ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— BFS๋กœ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ„์‚ฐํ•  ์ˆ˜ ์žˆ๋‹ค.

 

๋ฌธ์ œ ํ•ด๊ฒฐ์˜ ํ•ต์‹ฌ ํŒ์€ ํ•˜์ดํผํŠœ๋ธŒ๋ฅผ ํฌํ•จํ•˜์—ฌ ์ „์ฒด ๋…ธ๋“œ๋ฅผ ๊ทธ๋ž˜ํ”„๋กœ ๊ตฌ์„ฑํ•ด์•ผ ํ•œ๋‹ค.

 

์˜ˆ์ œ 1๋ฒˆ์„ ์˜ˆ์‹œ๋กœ ๋“ค๋ฉด,

1 -> H -> 3 -> H -> 6 -> H -> 9
์œ„ ๊ณผ์ •์„ ํ†ตํ•ด 1๋ฒˆ ์—ญ๋ถ€ํ„ฐ N๋ฒˆ ์—ญ๊นŒ์ง€ ๋„์ฐฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ๋œ๋‹ค.

ํ•˜์ดํผํŠœ๋ธŒ๋Š” ์ค‘๊ฐ„ ๋‹ค๋ฆฌ ์—ญํ• ์„ ํ•ด์ค€๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.

 

๋งˆ์ง€๋ง‰์— ๊ณ„์‚ฐํ•  ๋•Œ๋Š” ์—ญ ์ด๋™ ๊ฑฐ๋ฆฌ๋งŒ ๊ณ„์‚ฐํ•˜๋ฉด ๋˜๊ธฐ๋•Œ๋ฌธ์— ํ•˜์ดํผ ํŠœ๋ธŒ ์ด๋™์ด ํฌํ•จ๋œ ๋น„์šฉ์„ ๋นผ๊ณ  1๋ฒˆ ์—ญ๋„ ๋น„์šฉ์— ํฌํ•จ์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ ์ด๋™๊ฑฐ๋ฆฌ / 2 + 1์„ ํ•ด์ค€๋‹ค.

 

graph์— ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•  ๋•Œ, ๊ฐ ์—ญ์ด ์กด์žฌํ•˜๋Š” ํ•˜์ดํผ ํŠœ๋ธŒ์™€ ํ•˜์ดํผํŠœ๋ธŒ๊ฐ€ ๊ฐ–๊ณ  ์žˆ๋Š” ์—ญ์˜ ๋ฒˆํ˜ธ๋ฅผ graph์— ๋„ฃ์–ด์ค€๋‹ค.

 

1๋ฒˆ ์˜ˆ์ œ๋ฅผ ์˜ˆ์‹œ๋กœ ์ธ์ ‘ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋ฉด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ฒฐ๊ณผ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค.

[
  [],             [ 10, 11 ],
  [ 10 ],         [ 10, 12 ],
  [ 11 ],         [ 11, 13 ],
  [ 12, 13, 14 ], [ 12, 13 ],
  [ 14 ],         [ 14 ],
  [ 1, 2, 3 ],    [ 1, 4, 5 ],
  [ 3, 6, 7 ],    [ 5, 6, 7 ],
  [ 6, 8, 9 ]
]

์ด๋ฐฐ์—ด์˜ ๊ธธ์ด๋Š” n(์—ญ์˜ ๊ฐœ์ˆ˜) + m(ํ•˜์ดํผ ํŠœ๋ธŒ์˜ ๊ฐœ์ˆ˜) + 1 ์ด ๋œ๋‹ค.

๊ณ„์‚ฐํ•˜๊ธฐ ์‰ฝ๊ฒŒ 0๋ฒˆ ์ธ๋ฑ์Šค๋Š” ์‚ฌ์šฉํ•˜์ง€ ์•Š๊ณ  1๋ฒˆ ์—ญ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๊ธฐ ๋•Œ๋ฌธ์— 1๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์‹œ์ž‘ํ•œ๋‹ค.


1๋ฒˆ ~ N๋ฒˆ๊นŒ์ง€๋Š” ์—ญ์ด ์–ด๋–ค ํ•˜์ดํผ ํŠœ๋ธŒ์— ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€.
N + 1๋ฒˆ ๋ถ€ํ„ฐ M๋ฒˆ ๊นŒ์ง€๋Š” ๋ช‡ ๋ฒˆ์งธ ํ•˜์ดํผ ํŠœ๋ธŒ๊ฐ€ ์–ด๋–ค ์—ญ๋“ค์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋Š”์ง€ ์ •๋ณด๋ฅผ ๊ฐ–๊ณ  ์žˆ๋‹ค.

 

1๋ฒˆ ์ธ๋ฑ์Šค๋ถ€ํ„ฐ ์˜ˆ๋ฅผ ๋“ค์ž๋ฉด 1๋ฒˆ ์ธ๋ฑ์Šค(์—ญ)๋Š” 10๋ฒˆ ์ธ๋ฑ์Šค(ํ•˜์ดํผํŠœ๋ธŒ)์™€ 11๋ฒˆ ํ•˜์ดํผํŠœ๋ธŒ์— ์กด์žฌํ•œ๋‹ค๋Š” ๋œป์ด๊ณ  10๋ฒˆ ์ธ๋ฑ์Šค(ํ•˜์ดํผํŠœ๋ธŒ)๋Š” 1,2,3๋ฒˆ ์—ญ์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

 

๊ทธ๋ž˜์„œ ํ์—๋Š” [๊ฑฐ๋ฆฌ, ๋…ธ๋“œ]๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋˜๊ณ  1๋ฒˆ ๋…ธ๋“œ๋ถ€ํ„ฐ ์ˆœ์ฐจ์ ์œผ๋กœ ๋„ˆ๋น„์šฐ์„ ํƒ์ƒ‰์„ ์ง„ํ–‰ํ•œ๋‹ค.

๋ฐฉ๋ฌธ์„ ํ•˜๋ฉด์„œ ํ•ด๋‹น ๋…ธ๋“œ์˜ ๋ชจ๋“  ์š”์†Œ๋“ค์„ ํ์— ๋„ฃ์–ด์ฃผ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ๋งŒ ๋ฐฉ๋ฌธ์„ ์ง„ํ–‰ํ•ด์•ผ ํ•œ๋‹ค.

 

์ง„ํ–‰ํ•˜๋‹ค๊ฐ€ ํ˜„์žฌ ๋…ธ๋“œ๊ฐ€ n๋ฒˆ์ด ๋๋‹ค๋ฉด ๊ฒฐ๊ณผ๋ฅผ ์ถœ๋ ฅํ•œ๋‹ค.

 

ํ๊ฐ€ ๋นŒ ๋•Œ๊นŒ์ง€ N๋ฒˆ์— ๋„๋‹ฌํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด -1์„ ์ถœ๋ ฅํ•œ๋‹ค.

๋ฐ˜์‘ํ˜•
profile

๐Ÿ’ป์šฉ๋‡ฝ ๊ฐœ๋ฐœ ๋…ธํŠธ๐Ÿ’ป

@์šฉ๋‡ฝ

ํฌ์ŠคํŒ…์ด ์ข‹์•˜๋‹ค๋ฉด "์ข‹์•„์š”โค๏ธ" ๋˜๋Š” "๊ตฌ๋…๐Ÿ‘๐Ÿป" ํ•ด์ฃผ์„ธ์š”!