-
[Python] ๋ฐฑ์ค 11265 ๋๋์ง ์๋ ํํฐ (Floyd-Warshall)๐ป Algorithm/Python 2022. 7. 8. 23:43
๐ ๋ฌธ์
ํํฐ๋ฅผ ์ข์ํ๋ ๋ฏผํธ๋ ๋์์ด ํํฐ๊ฐ ์ด๋ฆฌ๋ ๋์ด๋์ฐ "๋ฏผํธ์๋"๋ฅผ ์ธ์ ๋ค. ์ฒ์์๋ ํ๊ฐ์ ํํฐ์ฅ๋ง์ ๊ฐ์ง๊ณ ์๋ ์์ ๋์ด๋์ฐ์ด์์ง๋ง, ์ฌ๋๋ค์ ์ ์ ๋ง์ด ์ฐพ์์ ํํฐ์ฅ์ ์ฆ์ถํ๊ณ ํ์ฌ๋ N๊ฐ์ ํํฐ์ฅ์ ๊ฐ์ง ํฐ ๋์ด๋์ฐ์ด ๋์๋ค. ๋ฏผํธ๋ ํํฐ์ฅ์ ์ฆ์ถํ ๋๋ง๋ค ํธ์๋ฅผ ์ํด ์๋ก์ด ํํฐ์ฅ๊ณผ ๊ธฐ์กด์ ๋ชจ๋ ํํฐ์ฅ์ด ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ์ด ๋ ์ ์๋ ๋๋ก๋ค์ ๋ง๋ค์๋ค. ์ด๋ ๋ง๋ค์ด์ง ๋๋ก๋ค์ ์ฌ์ฉ์๋ค์ ํธ์๋ฅผ ์ํด ์ผ๋ฐฉํตํ์ผ๋ก ์ค๊ณ๊ฐ ๋์๋ค.
ํํฐ์ฅ์ด ์ ์๋๋ ๊ด์ฐฎ์์ง๋ง ํํฐ์ฅ์ด ๋ง์์ง ์ง๊ธ ๋ค์๊ณผ ๊ฐ์ ๋ ๊ฐ์ง ๋ฌธ์ ์ ์ด ๋ฐ์ํ๋ค.
- A ํํฐ์ฅ์์ B ํํฐ์ฅ์ผ๋ก ๋นจ๋ฆฌ ๊ฐ ์ ์๋๋ก ์ง์ ์ฐ๊ฒฐ์ด ๋ ์ผ๋ฐฉํตํ ๋๋ก๋ฅผ ๋ง๋ค์์ง๋ง A์ B๊ฐ ์๋ ๋ค๋ฅธ ํํฐ์ฅ์ ๊ฒฝ์ ํด์ ๋ ๋นจ๋ฆฌ ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค.
- ์ง๊ธ์ผ๋ก๋ถํฐ C๋งํผ์ ์๊ฐ ๋ค์ B๋ฒ ํํฐ์ฅ์์ ์๋กญ๊ฒ ํํฐ๊ฐ ์ด๋ฆฌ๋๋ฐ 1๋ฒ๊ณผ ๊ฐ์ ์ด์ ๋๋ฌธ์ ํ์ฌ ์๋ Aํํฐ์ฅ์์ B๋ฒ ํํฐ์ฅ๊น์ง ํํฐ๊ฐ ์ด๋ฆฌ๋ ์๊ฐ๊น์ง ๋ง์ถฐ ๊ฐ ์ ์๋์ง ์ฝ๊ฒ ์ ์ ์๋ค.
์ด๋ฌํ ๋ฌธ์ ์ ์ผ๋ก ์ด์ฉ๊ฐ๋ค์ ๋ถ๋ง์ด ์ ์ ์ปค์ ธ๊ฐ๊ณ ๋ฏผํธ๋ ์ด๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋น ๋ฅธ ๋ค๋น๊ฒ์ด์ ์๋น์ค๋ฅผ ์คํํ๊ธฐ๋ก ํ์์ผ๋ ์๋น์ค ์์ฒญ์ด ๋๋ฌด ๋ง์ ์ ๋ฌด๊ฐ ๋ง๋น๋๊ธฐ์ ์ด๋ฅด๋ ๋ค. ์ด์ ๋ฏผํธ๋ ์ฒ์ฌํ๋ก๊ทธ๋๋จธ์ธ ๋น์ ์๊ฒ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด ๋ฌ๋ผ๊ณ ์์ฒญํ์๋ค. ๋ฏผํธ๋ฅผ ๋์ ํ ํํฐ์ฅ์์ ๋ค๋ฅธ ํํฐ์ฅ์๊น์ง ์๊ฐ๋ด์ ๋์ฐฉํ ์ ์๋์ง ์๋์ง ์์๋ด์ฃผ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ ๋ฒ์งธ ์ค์๋ ํํฐ์ฅ์ ํฌ๊ธฐ N(5 ≤ N ≤ 500)๊ณผ ์๋น์ค๋ฅผ ์์ฒญํ ์๋์ ์ M(1 ≤ M ≤ 10,000) ์ด ์ฃผ์ด์ง๋ค. ๊ฐ๊ฐ์ ํํฐ์ฅ์ 1๋ฒ๋ถํฐ N๋ฒ๊น์ง ๋ฒํธ๊ฐ ๋ถ์ฌ์ ธ ์๋ค. ๋ค์์๋ N๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ๊ฐ N๊ฐ์ ์๊ฐ ์ฃผ์ด์ง๋ค. i๋ฒ์งธ ์ค์ j๋ฒ์งธ ์ T(1 ≤ T ≤ 1,000,000)๋ i๋ฒ ํํฐ์ฅ์์ j๋ฒ ํํฐ์ฅ์ผ๋ก ์ง์ ์ ์ผ๋ก ์ฐ๊ฒฐ๋ ๋๋ก๋ฅผ ํตํด ์ด๋ํ๋ ์๊ฐ์ ์๋ฏธํ๋ค.
๋ค์ M๊ฐ์ ์ค์๋ ์ธ๊ฐ์ ์ ์ A, B, C๊ฐ ์ฃผ์ด์ง๋ค. A(1 ≤ A ≤ N) ๋ ์๋น์ค๋ฅผ ์์ฒญํ ์๋์ด ์์นํ ํํฐ์ฅ์ ๋ฒํธ, B(1 ≤ B ≤ N) ๋ค์ ํํฐ๊ฐ ์ด๋ฆฌ๋ ํํฐ์ฅ์ ๋ฒํธ, C(1 ≤ C ≤ 1,000,000,000)๋ ์ง๊ธ์ผ๋ก๋ถํฐ ๋ค์ ํํฐ๊ฐ ์ด๋ฆฌ๋๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ์๋ฏธํ๋ค.
์ถ๋ ฅ
M๊ฐ์ ์ค์ ๊ฑธ์ณ ์๋น์ค๋ฅผ ์์ฒญํ ์๋์ด ์๊ฐ๋ด์ ๋ค๋ฅธ ํํฐ์ฅ์ ๋์ฐฉํ ์ ์์ผ๋ฉด “Enjoy other party”๋ฅผ, ์๊ฐ๋ด์ ๋์ฐฉํ ์ ์์ผ๋ฉด "Stay here”๋ฅผ ์ถ๋ ฅํ๋ค.
์์ ์ ๋ ฅ 1
5 10 0 4 4 8 7 7 0 7 7 4 1 4 0 5 4 5 2 2 0 7 1 4 1 6 0 1 3 8 2 4 1 4 1 1 1 5 5 3 2 1 3 2 5 4 5 10 5 3 2 1 4 1 1 4 11
์์ ์ถ๋ ฅ 1
Enjoy other party Stay here Stay here Stay here Stay here Enjoy other party Enjoy other party Enjoy other party Stay here Enjoy other party
๐ ํ์ด
๐ฌ Code
import sys input = sys.stdin.readline n, m = map(int, input().split()) graph = [list(map(int, input().split())) for _ in range(n)] for k in range(n): for i in range(n): for j in range(n): if graph[i][j] > graph[i][k] + graph[k][j]: graph[i][j] = graph[i][k] + graph[k][j] for _ in range(m): a, b, time = map(int, input().split()) if graph[a-1][b-1] <= time: print('Enjoy other party') else: print('Stay here')
๐ก Solution
A ํํฐ์ฅ์์ B ํํฐ์ฅ์ผ๋ก ๋นจ๋ฆฌ ๊ฐ ์ ์๋๋ก ์ง์ ์ฐ๊ฒฐ์ด ๋ ์ผ๋ฐฉํตํ ๋๋ก๋ฅผ ๋ง๋ค์์ง๋ง A์ B๊ฐ ์๋ ๋ค๋ฅธ ํํฐ์ฅ์ ๊ฒฝ์ ํด์ ๋ ๋นจ๋ฆฌ ๊ฐ ์ ์๋ ๊ฒฝ์ฐ๊ฐ ์์ ์ ์๋ค.
์์ ์กฐ๊ฑด ๋๋ฌธ์ ์ด ๋ฌธ์ ๋ ์ต๋จ๊ฒฝ๋ก ๋ฌธ์ ์ ํด๋นํ๊ณ , ๋ชจ๋ ๋ ธ๋์ ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ณ์ฐํด์ผ ํ๋ฏ๋ก ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ ์ฌ์ฉํ์ต๋๋ค.
for k in range(n): for i in range(n): for j in range(n): if graph[i][j] > graph[i][k] + graph[k][j]: graph[i][j] = graph[i][k] + graph[k][j]
i ํํฐ์ฅ์์ j ํํฐ์ฅ์ผ๋ก ๊ฐ๋ ค๊ณ ํ ๋, k ํํฐ์ฅ์ ๊ฒฝ์ ํด์ ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ ๋น ๋ฅด๋ค๋ฉด ๊ฒฝ์ ํ๋ ๊ฒ์ผ๋ก ์ต๋จ๊ฒฝ๋ก๋ฅผ ๊ฐฑ์ ํด์ค๋๋ค.
for _ in range(m): a, b, time = map(int, input().split()) if graph[a-1][b-1] <= time: print('Enjoy other party') else: print('Stay here')
๋ฌธ์ ์์ ํํฐ์ฅ์ ๋ฒํธ๋ฅผ 1๋ฒ๋ถํฐ n๋ฒ๊น์ง๋ก ์ง์ ํ๊ธฐ ๋๋ฌธ์, graph์ ์ ๊ทผํ ๋๋ ์ธ๋ฑ์ค์ 1์ฉ ๋นผ ์ค ์ํ๋ก ์ ๊ทผํด์ผ ํฉ๋๋ค.
๐ค ์๊ฐ์ด๊ณผ Issue
min์ผ๋ก ์ต์๊ฐ ๊ฐฑ์ โ
for k in range(n): for i in range(n): for j in range(n): graph[i][j] = min(graph[i][j], graph[i][k] + graph[k][j])
if๋ฌธ์ผ๋ก ์ต์๊ฐ ๊ฐฑ์ โญ
for k in range(n): for i in range(n): for j in range(n): if graph[i][j] > graph[i][k] + graph[k][j]: graph[i][j] = graph[i][k] + graph[k][j]
min()์ ์ฌ์ฉํ ๊ฒฝ์ฐ graph[i][j], graph[i][k] + graph[k][j]๋ฅผ ๋น๊ตํ ํ graph[i][j]์ ํ ๋นํ๋ ์์ ์ด ๋งค๋ฒ ์คํ๋ฉ๋๋ค. ๋๋ฌธ์ graph[i][j]๋ฅผ graph[i][j]์ ํ ๋นํ๋ ์ผ์ด ๋น๋ฒํ๊ฒ ๋ฐ์ํ ๊ฒ์ ๋๋ค.
๋ฐ๋ฉด if๋ฌธ์ ์กฐ๊ฑด์ด ๋ง์ง ์์ผ๋ฉด ํ ๋นํ์ง ์๊ณ ๋์ด๊ฐ๊ธฐ ๋๋ฌธ์ ๋ถํ์ํ ํ ๋น ์์ ์ด ๋ฐ์ํ์ง ์์ต๋๋ค.
for i in range(n) โ
for i in range(m): a, b, time = map(int, input().split())
for _ in range(n) โญ
for _ in range(m): a, b, time = map(int, input().split())
for๋ฌธ์์ ๋ณ์ i๋ฅผ ์ฌ์ฉํ ์ผ์ด ์์ผ๋ฉด ๋ณ์๋ฅผ ์ง์ ํ์ง ์๋ ์ต๊ด ๋ค์ด๊ธฐ ใ ์ ์ด๊ฑฐ ํ๋ ๋๋ฌธ์ ์๊ฐ์ด๊ณผ์ ๊ฑธ๋ ค๋ฒ๋ฆด ์ค ๋ชฐ๋์ด์........
pypy3์ผ๋ก ์ฑ์ ํ๋ฉด ๋ ๋ค โ๋ก ์์ฑํด๋ ์๊ฐ์ด๊ณผ ํ์ ์์ด ์ ๋ตํ์ ์ ๋ฐ์ ์ ์์ง๋ง, python3์ผ๋ก ์ฑ์ ํ๋ฉด ๋ ๋ค โญ๋ก ์์ฑํด์ผ ์ ๋ตํ์ ์ ๋ฐ์ ์ ์์ต๋๋ค.
ํ๋ก์ด๋ ์์ ์๊ณ ๋ฆฌ์ฆ์ ๋ ธ๋๊ฐ 500๊ฐ ์ดํ์ผ ๊ฒฝ์ฐ์ ์ ํฉํ๋ฐ, ์ด ๋ฌธ์ ์์๋ ๋ ธ๋๊ฐ ์ต๋ 500๊ฐ๊ฐ ์ฃผ์ด์ ธ์ ์๊ฐ์ด ์๋นํ ๊ฐ๋น๊ฐ๋นํฉ๋๋ค. ์๊ฐ์ด ๋๋ํ๋ฉด ๋ฌด์ํ ๋งํ ์ฐจ์ด๊ฒ ์ผ๋, 500๊ฐ์ ๋ ธ๋๋ก 3์ค for๋ฌธ์ ๋๋ฆฌ๋ค ๋ณด๋ ์์ ์ด ๋ง์ ๋ฏธ๋ฌํ ์ฐจ์ด๊ฐ ์๊ฐ์ด๊ณผ ํ์ ์ฌ๋ถ๋ฅผ ๊ฐ๋ฅด๊ฒ ๋๋ ๊ฒ ^_ใ
'๐ป Algorithm > Python' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python] ํ๋ก๊ทธ๋๋จธ์ค ๊ฑฐ๋ฆฌ๋๊ธฐ ํ์ธํ๊ธฐ (๊ตฌํ) (0) 2022.07.08 [Python] ๋ฐฑ์ค 18352 ํน์ ๊ฑฐ๋ฆฌ์ ๋์ ์ฐพ๊ธฐ (Dijkstra) (0) 2022.07.08 [Python] ๋ฐฑ์ค 11000 ๊ฐ์์ค ๋ฐฐ์ (Heapq) (0) 2022.07.08 [Python] ๋ฐฑ์ค 3107 IPv6 (String) (0) 2022.07.08 [Python] ๋ฐฑ์ค 13022 ๋๋์ ์ฌ๋ฐ๋ฅธ ๋จ์ด (String) (0) 2022.07.08