[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์ˆœ์œ„ / ํŒŒ์ด์ฌ
Problem Solving ๐Ÿ”ฅ/ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค

[ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] ์ˆœ์œ„ / ํŒŒ์ด์ฌ

๋ฌธ์ œ ์„ค๋ช…

์ˆœ์œ„

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

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

์ œํ•œ์‚ฌํ•ญ

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

์ž…์ถœ๋ ฅ ์˜ˆ

nresultsreturn

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

์ž…์ถœ๋ ฅ ์˜ˆ ์„ค๋ช…

2๋ฒˆ ์„ ์ˆ˜๋Š” [1, 3, 4] ์„ ์ˆ˜์—๊ฒŒ ํŒจ๋ฐฐํ–ˆ๊ณ  5๋ฒˆ ์„ ์ˆ˜์—๊ฒŒ ์Šน๋ฆฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 4์œ„์ž…๋‹ˆ๋‹ค.
5๋ฒˆ ์„ ์ˆ˜๋Š” 4์œ„์ธ 2๋ฒˆ ์„ ์ˆ˜์—๊ฒŒ ํŒจ๋ฐฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— 5์œ„์ž…๋‹ˆ๋‹ค.

ํ’€์ด

set()์œผ๋กœ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค.
์ž์‹ ๋ณด๋‹ค ์œ„์— ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜ + ์ž์‹ ๋ณด๋‹ค ๋ฐ‘์— ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜ == n - 1 ์ธ ๊ฒฝ์šฐ ๋“ฑ์ˆ˜๋ฅผ ๊ตฌํ•  ์ˆ˜ ์žˆ๋Š”๋ฐ
์ž์‹ ๋ณด๋‹ค ์œ„์— ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์ˆ˜๋ฅผ ์•Œ๊ธฐ ์œ„ํ•ด์„ , ์ž์‹ ๋ณด๋‹ค ์œ„์— ์žˆ๋Š” ์‚ฌ๋žŒ์˜ ์œ„์— ์žˆ๋Š” ์‚ฌ๋žŒ์„ ์ถ”๊ฐ€(์—…๋ฐ์ดํŠธ)ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
๋ง์ด ์–ด๋ ค์šด๋ฐ ์ฝ”๋“œ๋ฅผ ๋ณด๋ฉด ์‰ฝ๋‹ค.
ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ํ‘ธ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”๋ฐ ๊ฐœ์ธ์ ์œผ๋กœ๋Š” ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋ฌธ์ œ ๊ฐ™์ง€๋Š” ์•Š์•„ ์„ค๋ช…ํ•˜์ง€ ์•Š๊ฒ ๋‹ค.

def solution(n, results):
    answer = 0
    lower = [set() for _ in range(n+1)] 
    upper = [set() for _ in range(n+1)]

    for [winner, loser] in results:
        upper[loser].add(winner)
        lower[winner].add(loser)

    for i in range(1, n+1):
        for low in lower[i]:
            upper[low].update(upper[i])
        for up in upper[i]:
            lower[up].update(lower[i])

    for i in range(1, n+1):
        if len(upper[i]) + len(lower[i]) == n - 1:
            answer += 1

    return answer