~๋ชฉ์ฐจ~
๋ฌธ์
https://school.programmers.co.kr/learn/courses/30/lessons/49191
๋ฌธ์ ํด๊ฒฐ ํฌ์ธํธ
- ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ผ๋ก ํด๊ฒฐ ๊ฐ๋ฅํ ๋ฌธ์
- ์ ์ i๊ฐ 1๋ถํฐ N๊น์ง ๋ชจ๋ ์ ์ ์ผ๋ก ๊ฐ ์ ์๋ค๋ฉด ์์๋ฅผ ์ ์ ์๋ค.
- ์ด๊ธฐ ์ธ์ ํ๋ ฌ์ ๋ฌดํ์๋ก ์ด๊ธฐํ, ์ฐ๊ด์ด ์๋ ๋ ์ ์ results๋ 1๋ก ์ด๊ธฐํํ๋ค.
์ด๋ 1๋ฒ์ ๊ฑธ์ณ a ์ ์ ๊ณผ b ์ ์ ์ด ๊ด๊ณ๊ฐ ์๋ค๋ ๋ป์ด๋ค.
- a ์ ์ ์์ b ์ ์ ์ผ๋ก ๋ฐ๋ก ๊ฐ๋ ๋ฐฉ๋ฒ (a -> b) ๋๋ k๋ฅผ ๊ฑฐ์น๋ ๋ฐฉ๋ฒ (a -> k -> b) ์ค ์์ ๊ฒฝ์ฐ๋ก ์ ๋ฐ์ดํธ
- ์ ์ i์์ j๋ก ๊ฐ๋ ๋ฐฉ๋ฒ( ์์๊ฐ i๋ณด๋ค j๊ฐ ํฌ๋ค ) ๋๋ j์์ i๋ก ๊ฐ๋ ๋ฐฉ๋ฒ ( ์์๊ฐ i๋ณด๋ค j๊ฐ ์๋ค)
ํ๋๋ผ๋ ์๊ณ ์๋ค๋ฉด ๋์ ์๊ด๊ด๊ณ๊ฐ ์กด์ฌํ๋ค๋ ์๋ฏธ
- ํ ์คํธ ์ผ์ด์ค์์ graph์ ์ํ๋ฅผ ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค
์ฌ๊ธฐ์ ์์ ์ธ๊ธํ๋ฏ i์์ j๋ก ๊ฐ๋ ๋ฐฉ๋ฒ ๋๋ j์์ i๋ก ๊ฐ๋ ๋ ๋ฐฉ๋ฒ ์ด๋ ๊ฒ๋ ์ฐ๊ฒฐ์ด ์๋ค๋ฉด(๋ฌดํ์๋ผ๋ฉด)
๋ ์ ์ ์ ๊ด๊ณ๋ ์๋ ๊ฒ์ด๊ณ , ํด๋น i ์ ์ ์ ์์๋ฅผ ์ ์ ์๋ค.
๋ชจ๋ ์ ์ ๊ณผ์ ๊ด๊ณ๊ฐ ์กด์ฌํ๋ ๊ฒฝ์ฐ๋ 2์ 5 ๋ ๊ฐ์ง ๊ฒฝ์ฐ๋ก, ๊ทธ๋ฆผ์ผ๋ก ์ดํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค
โฌ ํ๋ก์ด๋ ์์ ๊ด๋ จ ์์ฑ ๊ธ์ ์ฐธ๊ณ ํ์ธ์
์์ฑ ์ฝ๋
INF = int(1e9)
def solution(n, results):
graph = [[INF]*(n+1) for _ in range(n+1)] # ์ธ์ ํ๋ ฌ
result = 0
for a, b in results: # ์ง์ ์ฐ๊ด์ด ์๋ ๊ด๊ณ ์
๋ฐ์ดํธ
graph[a][b] = 1
# ํ๋ก์ด๋-์์
์๊ณ ๋ฆฌ์ฆ
for k in range(1, n+1):
for a in range(1, n+1):
for b in range(1, n+1):
# ํ ์ด์ด ๊ฐ๋ค๋ฉด 0, ๋ค๋ฅด๋ค๋ฉด a -> b ์ a -> k -> b ์ค ์งง์ ๊ฑฐ๋ฆฌ ์ ํ
graph[a][b] = min(graph[a][b], graph[a][k] + graph[k][b]) if a != b else 0
for i in range(1, n+1):
flag = False # ์ ์ i์ ๋ํด i -> j ๋๋ j -> i๋ก ๊ฐ ์ ์๋ ๋ฐฉ๋ฒ์ด ์๋์ง ํ๋ณ
for j in range(1, n+1):
if i != j and graph[i][j] == INF and graph[j][i] == INF:
flag = True # ์ ์ i๋ก๋ถํฐ ๋๋ฌ ํ ์ ์๋ ์ ์ ์ด ํ๋๋ผ๋ ์์ผ๋ฉด ์์๋ฅผ ์ ์ ์์
break
if not flag: # i ์ ์ ์ผ๋ก๋ถํฐ ๋ชจ๋ ์ ์ ์ผ๋ก ๋๋ฌ ํ ์ ์๋ค๋ฉด
result += 1
return result
๋์์ด ๋์ จ๋ค๋ฉด ์ข์์ ๋๋ฌ์ฃผ์ธ์๐