๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

Algorithm

[Algorithm] ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ

๐Ÿ“‹ ๋ฌธ์ œ

n๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ๋Š” ๊ทธ๋ž˜ํ”„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ๋…ธ๋“œ๋Š” 1๋ถ€ํ„ฐ n๊นŒ์ง€ ๋ฒˆํ˜ธ๊ฐ€ ์ ํ˜€์žˆ์Šต๋‹ˆ๋‹ค. 1๋ฒˆ ๋…ธ๋“œ์—์„œ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋…ธ๋“œ์˜ ๊ฐฏ์ˆ˜๋ฅผ ๊ตฌํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋…ธ๋“œ๋ž€ ์ตœ๋‹จ๊ฒฝ๋กœ๋กœ ์ด๋™ํ–ˆ์„ ๋•Œ ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๊ฐ€ ๊ฐ€์žฅ ๋งŽ์€ ๋…ธ๋“œ๋“ค์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ n, ๊ฐ„์„ ์— ๋Œ€ํ•œ ์ •๋ณด๊ฐ€ ๋‹ด๊ธด 2์ฐจ์› ๋ฐฐ์—ด vertex๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ, 1๋ฒˆ ๋…ธ๋“œ๋กœ๋ถ€ํ„ฐ ๊ฐ€์žฅ ๋ฉ€๋ฆฌ ๋–จ์–ด์ง„ ๋…ธ๋“œ๊ฐ€ ๋ช‡ ๊ฐœ์ธ์ง€๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

 

์ œํ•œ ์‚ฌํ•ญ

  • ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜ n์€ 2 ์ด์ƒ 20,000 ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๊ฐ„์„ ์€ ์–‘๋ฐฉํ–ฅ์ด๋ฉฐ ์ด 1๊ฐœ ์ด์ƒ 50,000๊ฐœ ์ดํ•˜์˜ ๊ฐ„์„ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • vertex ๋ฐฐ์—ด ๊ฐ ํ–‰ [a, b]๋Š” a๋ฒˆ ๋…ธ๋“œ์™€ b๋ฒˆ ๋…ธ๋“œ ์‚ฌ์ด์— ๊ฐ„์„ ์ด ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

6 [[3, 6], [4, 3], [3, 2], [1, 3], [1, 2], [2, 4], [5, 2]] 3

 

 

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

์ตœ๊ทผ์— ํ’€์—ˆ์—ˆ๋˜ ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค์˜ ๋ถ€๋Œ€๋ณต๊ท€์™€ ๋น„์Šทํ•œ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ–ˆ๋‹ค. ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด BFS๋ฅผ ๋Œ๋ ธ๋Š”๋ฐ ๋จผ์ € graphํ™” ์‹œํ‚ค๋Š” ๊ฒƒ์ด ํ•„์š”ํ–ˆ๋‹ค. ๊ฐ์ฒด์— key๋ฅผ node๋กœ, value๋ฅผ ๊ฐˆ ์ˆ˜ ์žˆ๋Š” node๋กœ ๋งŒ๋“ค์–ด์คฌ๋‹ค. ๋‹ค์‹œ ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์„ ๋ง‰๊ธฐ ์œ„ํ•ด check ๋ฐฐ์—ด์„ ๋งŒ๋“ค์–ด์ฃผ๊ณ  ๊ฐ€์žฅ ๋จผ ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ๋Š” ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฐ ๋…ธ๋“œ์™€์˜ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” distArr ๋ฐฐ์—ด, ๊ฐ€์žฅ ๋จผ ๊ฑฐ๋ฆฌ๋ฅผ ์ €์žฅํ•˜๋Š” maxDist ๋ณ€์ˆ˜๋ฅผ ์„ ์–ธํ•˜๊ณ  BFS๋ฅผ ๋Œ๋ฉด์„œ ๊ฐ’์„ ์ €์žฅํ•˜๊ณ  maxDist๋ฅผ ๊ฐฑ์‹ ์‹œ์ผฐ๋‹ค. BFS๊ฐ€ ๋๋‚˜๊ณ  distArr ๋ฐฐ์—ด์„ ์ˆœํšŒํ•˜๋ฉด์„œ maxDist์— ํ• ๋‹น๋˜์–ด ์žˆ๋Š” ๊ฐ’๊ณผ ๋น„๊ตํ•˜๋ฉฐ answer๋ฅผ ๊ณ„์‚ฐํ–ˆ๋‹ค.

 

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

function solution(n, edge) {
  var answer = 0;

  const graph = {};

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

  const queue = [1];
  const distArr = new Array(n + 1).fill(0);
  const check = new Array(n + 1).fill(0);
  let dist = 1;
  let maxDist = 1;

  check[1] = 1;

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

      for (const nextNode of graph[node]) {
        if (check[nextNode]) continue;
        distArr[nextNode] = dist;
        maxDist = maxDist < dist ? dist : maxDist;
        check[nextNode] = 1;
        queue.push(nextNode);
      }
    }
    dist++;
  }

  for (const dist of distArr) {
    if (dist === maxDist) answer += 1;
  }

  return answer;
}