Algorithm

[Algorithm] ๋ถ€๋Œ€๋ณต๊ท€

ghkdu2 2023. 3. 2. 01:38

๐Ÿ“‹ ๋ฌธ์ œ

๊ฐ•์ฒ ๋ถ€๋Œ€์˜ ๊ฐ ๋ถ€๋Œ€์›์ด ์—ฌ๋Ÿฌ ์ง€์—ญ์— ๋ฟ”๋ฟ”์ด ํฉ์–ด์ ธ ํŠน์ˆ˜ ์ž„๋ฌด๋ฅผ ์ˆ˜ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. ์ง€๋„์—์„œ ๊ฐ•์ฒ ๋ถ€๋Œ€๊ฐ€ ์œ„์น˜ํ•œ ์ง€์—ญ์„ ํฌํ•จํ•œ ๊ฐ ์ง€์—ญ์€ ์œ ์ผํ•œ ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ถ„๋˜๋ฉฐ, ๋‘ ์ง€์—ญ ๊ฐ„์˜ ๊ธธ์„ ํ†ต๊ณผํ•˜๋Š” ๋ฐ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์€ ๋ชจ๋‘ 1๋กœ ๋™์ผํ•ฉ๋‹ˆ๋‹ค. ์ž„๋ฌด๋ฅผ ์ˆ˜ํ–‰ํ•œ ๊ฐ ๋ถ€๋Œ€์›์€ ์ง€๋„ ์ •๋ณด๋ฅผ ์ด์šฉํ•˜์—ฌ ์ตœ๋‹จ์‹œ๊ฐ„์— ๋ถ€๋Œ€๋กœ ๋ณต๊ท€ํ•˜๊ณ ์ž ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์ ๊ตฐ์˜ ๋ฐฉํ•ด๋กœ ์ธํ•ด, ์ž„๋ฌด์˜ ์‹œ์ž‘ ๋•Œ์™€ ๋‹ค๋ฅด๊ฒŒ ๋˜๋Œ์•„์˜ค๋Š” ๊ฒฝ๋กœ๊ฐ€ ์—†์–ด์ ธ ๋ณต๊ท€๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๋ถ€๋Œ€์›๋„ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ•์ฒ ๋ถ€๋Œ€๊ฐ€ ์œ„์น˜ํ•œ ์ง€์—ญ์„ ํฌํ•จํ•œ ์ด์ง€์—ญ์˜ ์ˆ˜ n, ๋‘ ์ง€์—ญ์„ ์™•๋ณตํ•  ์ˆ˜ ์žˆ๋Š” ๊ธธ ์ •๋ณด๋ฅผ ๋‹ด์€ 2์ฐจ์› ์ •์ˆ˜ ๋ฐฐ์—ด roads, ๊ฐ ๋ถ€๋Œ€์›์ด ์œ„์น˜ํ•œ ์„œ๋กœ ๋‹ค๋ฅธ ์ง€์—ญ๋“ค์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ •์ˆ˜ ๋ฐฐ์—ด sources, ๊ฐ•์ฒ ๋ถ€๋Œ€์˜ ์ง€์—ญ destination์ด ์ฃผ์–ด์กŒ์„ ๋•Œ, ์ฃผ์–ด์ง„ sources์˜ ์›์†Œ ์ˆœ์„œ๋Œ€๋กœ ๊ฐ•์ฒ ๋ถ€๋Œ€๋กœ ๋ณต๊ท€ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ๋‹จ์‹œ๊ฐ„์„ ๋‹ด์€ ๋ฐฐ์—ด์„ returnํ•˜๋Š” solution ํ•จ์ˆ˜๋ฅผ ์™„์„ฑํ•ด์ฃผ์„ธ์š”. ๋ณต๊ท€๊ฐ€ ๋ถˆ๊ฐ€๋Šฅํ•œ ๊ฒฝ์šฐ ํ•ด๋‹น ๋ถ€๋Œ€์›์˜ ์ตœ๋‹จ์‹œ๊ฐ„์€ -1์ž…๋‹ˆ๋‹ค.

 

์ œํ•œ ์‚ฌํ•ญ

  • 3 ≤ n ≤ 100,000
    • ๊ฐ ์ง€์—ญ์€ ์ •์ˆ˜ 1๋ถ€ํ„ฐ n๊นŒ์ง€์˜ ๋ฒˆํ˜ธ๋กœ ๊ตฌ๋ถ„๋ฉ๋‹ˆ๋‹ค.
  • 2 ≤ roads์˜ ๊ธธ์ด ≤ 500,000
    • roads์˜ ์›์†Œ์˜ ๊ธธ์ด = 2
    • roads์˜ ์›์†Œ๋Š” [a, b] ํ˜•ํƒœ๋กœ ๋‘ ์ง€์—ญ a, b๊ฐ€ ์„œ๋กœ ์™•๋ณตํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.(1 ≤ a, b ≤ n, a ≠ b)
    • ๋™์ผํ•œ ์ •๋ณด๊ฐ€ ์ค‘๋ณตํ•ด์„œ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • ๋™์ผํ•œ [a, b]๊ฐ€ ์ค‘๋ณตํ•ด์„œ ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
      • [a, b]๊ฐ€ ์žˆ๋‹ค๋ฉด [b, a]๋Š” ์ฃผ์–ด์ง€์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • 1 ≤ sources์˜ ๊ธธ์ด ≤ 500
    • 1 ≤ sources[i] ≤ n
  • 1 ≤ destination ≤ n

 

์ž…์ถœ๋ ฅ ์˜ˆ

3 [[1, 2], [2, 3]] [2, 3] 1 [1, 2]
5 [[1, 2], [1, 4], [2, 4], [2, 5], [4, 5]] [1, 3, 5] 5 [2, -1, 0]

 

โœ๏ธ ํ’€์ด

๋ฌธ์ œ๋ฅผ ์ฝ๊ณ  ๊ธธ์„ ๊ทธ๋ž˜ํ”„ํ™” ์‹œ์ผœ์„œ BFS๋ฅผ ๋Œ๋ฆฌ๋ฉด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ทธ๋ž˜ํ”„๋Š” ๊ฐ์ฒด ๋‚ด ๋ฐฐ์—ด๋กœ ๊ตฌ์„ฑํ–ˆ๊ณ  ๋งค๊ฐœ๋ณ€์ˆ˜์ธ roads๋Š” ์–‘๋ฐฉํ–ฅ์ด๊ธฐ ๋•Œ๋ฌธ์— ์–‘์ชฝ์— ๋„ฃ์–ด์คฌ๋‹ค. ์ตœ๋‹จ๊ฑฐ๋ฆฌ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฐฉ๋ฌธํ•œ ์ง€์ ์„ ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๋‹ค๋ณด๋ฉด ์˜๋„์น˜์•Š์€ ๋จผ ๊ธธ์ด ๋‚˜์˜ฌ ๊ฒƒ์ด๊ณ  ์‹œ๊ฐ„์ดˆ๊ณผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์–ด check ๋ฐฐ์—ด์„ ํ™œ์šฉํ–ˆ๊ณ  answer์—๋Š” sources ์ˆœ์„œ๋Œ€๋กœ ๋“ค์–ด๊ฐ€์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณ„๋„์˜ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ–ˆ๋‹ค. ๋”ฐ๋ผ์„œ 100,000์˜ ๊ธธ์ด์ธ ๋ฐฐ์—ด์— ์ตœ๋‹จ๊ฑฐ๋ฆฌ๋ฅผ ํ‘œ์‹œํ•ด๋‘๊ณ  sources๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ answer์— ๋„ฃ์–ด์คฌ๋‹ค.

 

โŒจ๏ธ ์ฝ”๋“œ

function solution(n, roads, sources, destination) {
  var answer = [];

  const graph = {};

  for (const road of roads) {
    const [start, end] = road;
    if (graph[start]) graph[start].push(end);
    else graph[start] = [end];
    if (graph[end]) graph[end].push(start);
    else graph[end] = [start];
  }

  const queue = [destination];
  const sourcesArr = new Array(100000).fill(-1);
  const check = new Array(100000).fill(0);
  let dist = 1;

  sourcesArr[destination] = 0;
  check[destination] = 1;

  while (queue.length) {
    const len = queue.length;
    for (let i = 0; i < len; i++) {
      const area = queue.shift();
      if (!graph[area]) continue;

      for (const nextArea of graph[area]) {
        if (check[nextArea]) continue;
        sourcesArr[nextArea] = dist;
        check[nextArea] = 1;
        queue.push(nextArea);
      }
    }
    dist++;
  }

  for (const source of sources) {
    answer.push(sourcesArr[source]);
  }

  return answer;
}