โ๋ฌธ์
ํ๋ก๊ทธ๋๋จธ์ค
์ฝ๋ ์ค์ฌ์ ๊ฐ๋ฐ์ ์ฑ์ฉ. ์คํ ๊ธฐ๋ฐ์ ํฌ์ง์ ๋งค์นญ. ํ๋ก๊ทธ๋๋จธ์ค์ ๊ฐ๋ฐ์ ๋ง์ถคํ ํ๋กํ์ ๋ฑ๋กํ๊ณ , ๋์ ๊ธฐ์ ๊ถํฉ์ด ์ ๋ง๋ ๊ธฐ์ ๋ค์ ๋งค์นญ ๋ฐ์ผ์ธ์.
programmers.co.kr
๐์ ํ
๊ทธ๋ํ, Floyd-Warshall
โ๐ปํ์ด
1) ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ
- ์ด๊ธด ๊ทธ๋ํ์ ์ง ๊ทธ๋ํ๋ฅผ ์ธ์ ๋ฆฌ์คํธ ํํ๋ก ๋ง๋ฆ.
- 1์ 2๋ฒ์ ์ด๊น. 1๋ฒ์ ์ด๊ธด ๊ทธ๋ํ์ 2๋ฒ์๊ฒ ์ง 5๋ฒ ๋
ธ๋๋ฅผ ์
๋ฐ์ดํธ.
- 1์ ๋๊ตฌ์๊ฒ๋ ์ง์ง ์์.
- 2๋ฒ์ 5๋ฒ์ ์ด๊ธฐ๊ณ , 1, 3, 4๋ฒ์๊ฒ ์ง. 1, 3, 4๋ฒ ์ด๊ธด ๊ทธ๋ํ์ 5๋ฒ์ ์
๋ฐ์ดํธ.
5๋ฒ ์ง ๊ทธ๋ํ์๋ 1, 3, 4๋ฒ์ ์
๋ฐ์ดํธ.
- ๊ฐ ๋
ธ๋์ ์ด๊ธด ๊ทธ๋ํ์ ์ง ๊ทธ๋ํ์ ๊ธธ์ด์ ํฉ์ด n - 1๊ณผ ๊ฐ๋ค๋ฉด answer๋ฅผ 1 ์ฆ๊ฐ.
2) Floyd-Warshall
- 1๋ฒ์ด 2๋ฒ์ ์ด๊น. graph[2][1]์ 1๋ก ์ด๊ธฐํ. ์ด์ ๊ฐ์ด ์ง ๋ถ๋ถ์ 1๋ก ์ด๊ธฐํ.
- ๊ทธ๋ํ๋ฅผ ๋ฐ๋ผ DP๋ฅผ ํ์ฉํ์ฌ ์ต์ ๊ฒฝ๋ก ๊ณ์ฐ.
- INF๊ฐ ์๋ ๊ฒฝ์ฐ, ์ฆ ์์๋ฅผ ์ ํ ์ ์๋ค๋ฉด count๋ฅผ 1 ์ฆ๊ฐ.
- count๊ฐ n-1๊ณผ ๊ฐ๋ค๋ฉด answer์ 1 ์ฆ๊ฐ.
๐ป์ฝ๋
# ๊ทธ๋ํ ์๋ฃ๊ตฌ์กฐ ์ฌ์ฉ
from collections import defaultdict
def solution(n, results):
answer = 0
win, lose = defaultdict(set), defaultdict(set)
for i, j in results:
win[i].add(j)
lose[j].add(i)
for i in range(1, n + 1):
for w in win[i]:
lose[w].update(lose[i])
for l in lose[i]:
win[l].update(win[i])
for i in range(1, n + 1):
if len(win[i]) + len(lose[i]) == n - 1:
answer += 1
return answer
# Floyd-Warshall
def solution(n, results):
answer = 0
INF = 1e9
graph = [[INF] * (n + 1) for _ in range(n + 1)]
for i, j in results:
graph[j][i] = 1
for i in range(1, n + 1):
for j in range(1, n + 1):
if i == j:
graph[i][j] = 0
for k in range(1, n + 1):
for i in range(1, n + 1):
for j in range(1, n + 1):
graph[i][j] = min(graph[i][k] + graph[k][j], graph[i][j])
for i in range(1, n + 1):
count = 0
for j in range(1, n + 1):
if graph[i][j] != INF or graph[j][i] != INF:
count += 1
if count == n:
answer += 1
return answer
๐ก์๋ก ๋ฐฐ์ด ๋ด์ฉ
Floyd-Warshall
- ๊ฐ์ค์น ๊ทธ๋ํ์์ ๋ชจ๋ ๋
ธ๋์ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ์ฐพ์.
- ์•์์ ๊ฐ์ค์น ๊ทธ๋ํ์์ ๋ชจ๋ ์ฌ์ฉ ๊ฐ๋ฅ.
- ๋ฐฉํฅ, ๋ฌด๋ฐฉํฅ ๊ฐ์ค์น ๊ทธ๋ํ์์ ์ฌ์ฉ ๊ฐ๋ฅ.
- ๋ชจ๋ ๋
ธ๋ ์ฌ์ด์ ๊ฐ์ฅ ์งง์ ๊ฒฝ๋ก๋ฅผ ๊ตฌํ๊ธฐ ์ํด์๋ ๊ฐ๋ฅํ ๋ชจ๋ ๋
ธ๋์ ๋ํ์ฌ DP๋ก ๊ฐ๋ฅํ ๊ฒฝ๋ก๋ฅผ ํ์ธ.
- ๋คํธ์ํฌ ๋ฐ ์ฐ๊ฒฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ฉ์ด.
Pseudo-Code
------------------------------------------------------------------------------------------------
For i = 0 to n – 1
For j = 0 to n – 1
Distance[i, j] = min(Distance[i, j], Distance[i, k] + Distance[k, j])
where i = source Node, j = Destination Node, k = Intermediate Node
'Coding Test > Algorithms' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 15649.N๊ณผ M (1)/Java - Silver3 (0) | 2024.09.29 |
---|---|
[ํ๋ก๊ทธ๋๋จธ์ค] ์ฃผ์๊ฐ๊ฒฉ/Java - Lv.2 (0) | 2024.09.29 |
[๋ฐฑ์ค] 28278. ์คํ 2/Java - Silver4 (0) | 2024.09.28 |
[๋ฐฑ์ค] 2750. ์ ์ ๋ ฌํ๊ธฐ/Java - Bronze2 (1) | 2024.09.28 |
[๋ฐฑ์ค] 1546. ํ๊ท /Java - Bronze1 (1) | 2024.09.28 |