Algorithm

[Algorithm] ์ˆœ์œ„

ghkdu2 2023. 3. 8. 09:03

๐Ÿ“‹ ๋ฌธ์ œ

n๋ช…์˜ ๊ถŒํˆฌ์„ ์ˆ˜๊ฐ€ ๊ถŒํˆฌ ๋Œ€ํšŒ์— ์ฐธ์—ฌํ–ˆ๊ณ  ๊ฐ๊ฐ 1๋ฒˆ๋ถ€ํ„ฐ n๋ฒˆ๊นŒ์ง€ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ๊ถŒํˆฌ ๊ฒฝ๊ธฐ๋Š” 1๋Œ€1 ๋ฐฉ์‹์œผ๋กœ ์ง„ํ–‰์ด ๋˜๊ณ , ๋งŒ์•ฝ A ์„ ์ˆ˜๊ฐ€ B ์„ ์ˆ˜๋ณด๋‹ค ์‹ค๋ ฅ์ด ์ข‹๋‹ค๋ฉด A ์„ ์ˆ˜๋Š” B ์„ ์ˆ˜๋ฅผ ํ•ญ์ƒ ์ด๊น๋‹ˆ๋‹ค. ์‹ฌํŒ์€ ์ฃผ์–ด์ง„ ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ€์ง€๊ณ  ์„ ์ˆ˜๋“ค์˜ ์ˆœ์œ„๋ฅผ ๋งค๊ธฐ๋ ค ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ช‡๋ช‡ ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๋ถ„์‹คํ•˜์—ฌ ์ •ํ™•ํ•˜๊ฒŒ ์ˆœ์œ„๋ฅผ ๋งค๊ธธ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์„ ์ˆ˜์˜ ์ˆ˜ n, ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์€ 2์ฐจ์› ๋ฐฐ์—ด results๊ฐ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ฃผ์–ด์งˆ ๋•Œ ์ •ํ™•ํ•˜๊ฒŒ ์ˆœ์œ„๋ฅผ ๋งค๊ธธ ์ˆ˜ ์žˆ๋Š” ์„ ์ˆ˜์˜ ์ˆ˜๋ฅผ return ํ•˜๋„๋ก solution ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์ฃผ์„ธ์š”.

 

์ œํ•œ ์‚ฌํ•ญ

  • ์„ ์ˆ˜์˜ ์ˆ˜๋Š” 1๋ช… ์ด์ƒ 100๋ช… ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ๋Š” 1๊ฐœ ์ด์ƒ 4,500๊ฐœ ์ดํ•˜์ž…๋‹ˆ๋‹ค.
  • results ๋ฐฐ์—ด ๊ฐ ํ–‰ [A, B]๋Š” A ์„ ์ˆ˜๊ฐ€ B ์„ ์ˆ˜๋ฅผ ์ด๊ฒผ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.
  • ๋ชจ๋“  ๊ฒฝ๊ธฐ ๊ฒฐ๊ณผ์—๋Š” ๋ชจ์ˆœ์ด ์—†์Šต๋‹ˆ๋‹ค.

 

์ž…์ถœ๋ ฅ ์˜ˆ

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

 

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

์ •๋ง ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์‹œ๋„ํ–ˆ๋˜ ๋ฌธ์ œ์˜€๋‹ค. ์ฒซ ๋ฒˆ์งธ๋กœ ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ๋กœ ํ’€์–ด๋ณด๊ธฐ๋„ ํ–ˆ๋Š”๋ฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค ๋ช‡๊ฐœ๋ฅผ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•˜๋Š”๋ฐ ์ด์œ ๋ฅผ ์ฐพ์ง€ ๋ชปํ•ด์„œ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์ ‘๊ทผํ–ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ๋กœ๋Š” DFS๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์ด์—ˆ๋Š”๋ฐ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

๋จผ์ € ์ŠนํŒจ ๊ฒฐ๊ณผ๋ฅผ graph์— ์ €์žฅํ–ˆ๋‹ค. ์Šน๋ฆฌํ–ˆ์„ ๋•Œ, ํŒจ๋ฐฐํ–ˆ์„ ๋•Œ๋กœ ๋‘๊ฐœ์˜ graph๋ฅผ ๋”ฐ๋กœ ๋ถ„๋ฆฌํ•˜๊ณ  key๋Š” ์„ ์ˆ˜, value๋Š” ์ƒ๋Œ€ ์„ ์ˆ˜๋ฅผ ๋ฐฐ์—ด๋กœ ๊ด€๋ฆฌํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์„ ์ˆ˜๋ฅผ ํ•˜๋‚˜ํ•˜๋‚˜ ๋Œ๋ฉด์„œ DFS๋กœ ํƒ์ƒ‰ํ–ˆ๋‹ค.

 

์ฒ˜์Œ์— ์ƒ๊ฐ์„ ์ž˜๋ชปํ–ˆ๋˜ ์ ์ด ๊ฐ™์€ ์„ ์ˆ˜๋ฅผ ์ค‘๋ณต์œผ๋กœ ๋Œ์ง€ ์•Š๊ธฐ ์œ„ํ•ด ๋ฐฐ์—ด์— ๊ฐ’์„ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ ๋งŒ์•ฝ 2๋ฒˆ ์„ ์ˆ˜๊ฐ€ [5, 1] ์ด 2๋ช…์˜ ์„ ์ˆ˜์—๊ฒŒ ์Šน๋ฆฌํ•˜์—ฌ ๋ฐฐ์—ด์— ์ €์žฅํ•ด๋‘๊ณ  4๋ฒˆ ์„ ์ˆ˜๊ฐ€ [1, 2] ์„ ์ˆ˜์—๊ฒŒ ์Šน๋ฆฌํ•œ ๊ฒƒ์„ ๊ณ„์‚ฐํ•  ๋•Œ 2๋ฒˆ ์„ ์ˆ˜๋ฅผ ๋ฐฐ์—ด์— ์ €์žฅํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ธฐ ๋•Œ๋ฌธ์— ๋ˆ„๊ฐ€์—๊ฒŒ ์Šน๋ฆฌํ–ˆ๋Š”์ง€ ์•Œ ์ˆ˜ ์—†์–ด 1๋ฒˆ ์„ ์ˆ˜๊ฐ€ ์ค‘๋ณต๋˜๋Š” ๊ฒƒ์„ ๊ณ„์‚ฐํ•˜๋Š” ๊ฒƒ์ด ๋ถˆ๊ฐ€๋Šฅํ–ˆ๋‹ค.

 

๊ทธ๋ž˜์„œ ๊ณ ๋ฏผ์„ ํ•ด๋ณด๋‹ˆ ์„ ์ˆ˜๋Š” 100๋ช…์ด ์ตœ๋Œ€์ด๊ธฐ ๋•Œ๋ฌธ์— dfs์˜ ๊นŠ์ด๋Š” ์ตœ๋Œ€ 100์ด๋ฏ€๋กœ ์ตœ์•…์˜ ๊ฒฝ์šฐ์—๋„ 10000์˜ ๊ฒฝ์šฐ๋ฐ–์— ์—†๋‹ค๋Š” ๊ฒƒ์„ ์•Œ์•˜๋‹ค. ๊ทธ๋ž˜์„œ ๋ชจ๋“  ์„ ์ˆ˜๋ฅผ ์ˆœํšŒํ•˜๋ฉด์„œ ์Šน๋ฆฌ, ํŒจ๋ฐฐํ•œ ์„ ์ˆ˜๋ฅผ ์ฒดํฌํ•˜๋Š” ์ฒดํฌ ๋ฐฐ์—ด(checkWin, checkLose)์„ 2๊ฐœ ๋งŒ๋“ค์–ด DFS์— ๋„˜๊ฒจ์ฃผ๊ณ  DFS๋ฅผ ๋Œ๋ฉด์„œ ์ŠนํŒจ ์—ฌ๋ถ€๋ฅผ ์ฒดํฌํ•˜๊ณ  DFS๊ฐ€ ์ข…๋ฃŒ๋˜๋ฉด ์ด ์ฒดํฌ๋ฐฐ์—ด์„ reduce๋ฅผ ์‚ฌ์šฉํ•ด ํ•ฉ์„ ๊ตฌํ•ด ๋”ํ•ด์„œ ์ŠนํŒจ๋ฅผ ์•Œ๊ณ  ์žˆ๋Š” ์„ ์ˆ˜๊ฐ€ n - 1(๋ชจ๋“  ์„ ์ˆ˜ - ์ž๊ธฐ ์ž์‹ )๊ณผ ๊ฐ™๋‹ค๋ฉด ์ž์‹ ์ด ๋ช‡ ์ˆœ์œ„์ธ์ง€ ์ •ํ™•ํ•˜๊ฒŒ ์•Œ ์ˆ˜ ์žˆ๋‹ค๋Š” ์˜๋ฏธ์ด๋ฏ€๋กœ answer์— 1์„ ๋”ํ•ด์คŒ์œผ๋กœ์„œ ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

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

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

  const graphWinner = {};
  const graphLoser = {};

  for (const result of results) {
    const [winner, loser] = result;
    if (!graphLoser[winner]) graphLoser[winner] = [];
    graphLoser[winner].push(loser);

    if (!graphWinner[loser]) graphWinner[loser] = [];
    graphWinner[loser].push(winner);
  }

  const dfs = (player, type, check) => {
    const opponents = type === 'win' ? graphWinner[player] : graphLoser[player];
    if (!opponents) return;

    for (const opponent of opponents) {
      if (check[opponent]) continue;
      dfs(opponent, type, check);
      check[opponent] = 1;
    }

    return;
  };

  for (let player = 1; player < n + 1; player++) {
    const checkWin = new Array(n + 1).fill(0);
    const checkLose = new Array(n + 1).fill(0);

    dfs(player, 'win', checkWin);
    dfs(player, 'lose', checkLose);

    const cntWin = checkWin.reduce((a, b) => a + b, 0);
    const cntLose = checkLose.reduce((a, b) => a + b, 0);

    if (cntWin + cntLose === n - 1) answer += 1;
  }

  return answer;
}