728x90
๐๏ธ ๋ฌธ์

๐ Point
Dijkstra
๊ทธ๋ํ์์ ์ฌ๋ฌ ๊ฐ์ ๋ ธ๋๊ฐ ์์ ๋, ํน์ ๋ ธ๋์์ ์ถ๋ฐํ์ฌ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๊ฐ๊ฐ์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ฃผ๋ ์๊ณ ๋ฆฌ์ฆ
- ํ ์ง์ ์์ ๋ค๋ฅธ ํน์ ์ง์ ๊น์ง์ ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํ๋ค.
ํน์ง
- ์(-)์ ๊ฐ์ ์ด ์์ ๋ ์ ์์ ์ผ๋ก ๋์
- โ๊ฐ ๋ ธ๋์ ๋ํ ํ์ฌ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌโ ์ ๋ณด๋ฅผ ํญ์ 1์ฐจ์ ๋ฆฌ์คํธ์ ์ ์ฅํ๋ฉฐ ๋ฆฌ์คํธ๋ฅผ ๊ณ์ ๊ฐฑ์
์๋ ๋ฐฉ์
- ์ถ๋ฐ ๋ ธ๋๋ฅผ ์ค์ ํ๋ค.
- ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ์ด๊ธฐํํ๋ค.
- ๋ฐฉ๋ฌธํ์ง ์์ ๋ ธ๋ ์ค์์ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ฅ ์งง์ ๋ ธ๋๋ฅผ ์ ํํ๋ค.
- ํด๋น ๋ ธ๋๋ฅผ ๊ฑฐ์ณ ๋ค๋ฅธ ๋ ธ๋๋ก ๊ฐ๋ ๋น์ฉ์ ๊ณ์ฐํ์ฌ ์ต๋จ ๊ฑฐ๋ฆฌ ํ ์ด๋ธ์ ๊ฐฑ์ ํ๋ค.
- ์ ๊ณผ์ ์์ 3๋ฒ๊ณผ 4๋ฒ์ ๋ฐ๋ณตํ๋ค.
๐ ์ฝ๋
import heapq # ์ฐ์ ์์ ํ ์ฌ์ฉ
INF = int(1e10) # ๋ฌดํ์ผ๋ก ์ด๊ธฐํ
def main():
V, M = map(int, input().split())
graph = [[] for _ in range(V+1)] # ์ธ์ ๋ฆฌ์คํธ ๊ทธ๋ํ ์ด๊ธฐํ
for _ in range(M):
a, b, c = map(int, input().split()) # a์์ b๊น์ง ๊ฑฐ๋ฆฌ c
graph[a].append((b, c)) # ์๋ฐฉํฅ ๊ทธ๋ํ์ด๊ธฐ ๋๋ฌธ์ a,b์ ๊ฐ๊ฐ append ํด์ค์ผ ํจ
graph[b].append((a, c))
J, S = map(int, input().split()) # J: ์งํ ์ถ๋ฐ์ , S: ์ฑํ ์ถ๋ฐ์
J_distance = [INF] * (V+1) # ์งํ์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด
S_distance = [INF] * (V+1) # ์ฑํ์ ์ต๋จ ๊ฑฐ๋ฆฌ ๋ฐฐ์ด
# ๋ค์ต์คํธ๋ผ ๊ตฌํ
def dijkstra(start, distance):
q = []
heapq.heappush(q, (0, start))
distance[start] = 0
while q:
dist, now = heapq.heappop(q)
if distance[now] < dist:
continue
for i in graph[now]:
cost = dist + i[1]
if cost < distance[i[0]]:
distance[i[0]] = cost
heapq.heappush(q, (cost, i[0]))
# ์งํ
dijkstra(J, J_distance) # ์งํ์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ต์คํธ๋ผ ์คํ
# ์ฑํ
dijkstra(S, S_distance) # ์ฑํ์ ์์น๋ฅผ ๊ธฐ์ค์ผ๋ก ๋ค์ต์คํธ๋ผ ์คํ
place = -1 # ์ฝ์ ์ฅ์ ์ด๊ธฐํ
min_distance_sum = INF # ๊ฑฐ๋ฆฌ ํฉ ์ต์๊ฐ
# ์ฝ์ ์ฅ์ ์ ํ๊ธฐ
for i in range(1, V+1):
if i != J and i != S: # ์งํ๊ณผ ์ฑํ์ ์ถ๋ฐ์ ์ ์ ์ธ
if J_distance[i] + S_distance[i] < min_distance_sum: # ์ฝ์ ์ง์ ๊น์ง์ ์งํ, ์ฑํ ๊ฑฐ๋ฆฌ ํฉ์ ์ต์๊ฐ
min_distance_sum = J_distance[i] + S_distance[i]
min_j_dist = INF # ์งํ์ด ์ด๋ํ๋ ๊ฑฐ๋ฆฌ
# ๋ฒํธ๊ฐ ๊ฐ์ฅ ํฐ ๊ฒ๋ถํฐ ํ์ธํ๋ฉฐ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๊ฒฝ์ฐ๊ฐ ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ์์ ๋ฒํธ์ ์ง์ ์ฐพ๊ธฐ
for i in range(V, 0, -1):
jd, sd = J_distance[i], S_distance[i]
if i!= J and i != S:
if jd <= sd and jd + sd == min_distance_sum: # ์งํ์ด ๋ ๊ฐ๊น๊ฑฐ๋ ๋์ด ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๊ฐ์ ์ง์ ์ด๋ฉฐ ๊ฑฐ๋ฆฌ ํฉ์ด ์ต์์ธ ๊ฒฝ์ฐ
if min_j_dist >= jd: # ์งํ์ด ์ด๋ํ๋ ๊ฑฐ๋ฆฌ๊ฐ ๋ ์งง์ผ๋ฉด
place = i # ์ฝ์ ์ง์ ๊ฐฑ์
min_j_dist = jd # ์งํ์ด ์ด๋ํ๋ ๊ฑฐ๋ฆฌ ๊ฐฑ์
print(place)
if __name__ == "__main__":
main()
โ๐ป ํ์ด
์๊ฐ ๋ณต์ก๋ : O((V + M) log V)
1. ๋ค์ต์คํธ๋ผ
๋ณํ ์์ด ๊ธฐ๋ณธ ๋ค์ต์คํธ๋ผ ์๊ณ ๋ฆฌ์ฆ์ ๊ทธ๋๋ก ๊ตฌํํ ํ, ์ด๋ฅผ ํ์ฉํ๋ค.
- ์งํ๊ณผ ์ฑํ์ ๊ฐ ์ถ๋ฐ์ ์ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ ์ง์ ๊น์ง์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ค. (J_distance, S_distance)
- dijkstra(J (or S), J_distance(or S_distance)) ๋ก ์ ๋ ฅ๋ฐ์ ๋ ์ฌ๋์ ์ถ๋ฐ์ ์ start ๊ฐ์ผ๋ก ๋ฃ์ด์ค ํ ๊ณ์ฐํ๋ค.
2. ๊ฑฐ๋ฆฌ ์กฐ๊ฑด
์ด ๋ฌธ์ ๋ ์กฐ๊ฑด์ ์ฃผ์ด์ง ๋๋ก ์ฒ ์ ํ๊ฒ ๊ตฌํ์ ํด์ผ ํต๊ณผ๊ฐ ๋๋ค.
- ์ฒซ ๋ฒ์งธ for๋ฌธ : ๋ ์ฌ๋์ ์ฝ์ ์ง์ ๊น์ง ๊ฑฐ๋ฆฌ์ ํฉ์ด ์ต์๊ฐ ๋๋ ์ง์ ์ ์ฐพ๋๋ค.
- ๋ฌธ์ ์กฐ๊ฑด์ 1, 2์ ๋ถํฉํ๋ ์ง์ ์ ์ฐพ๊ณ ์ ํ๋ค.
- ์ฝ์ ์ง์ ์ ์งํ๊ณผ ์ฑํ์ ์์น๊ฐ ๋ ์ ์์ผ๋ฉฐ (i != J and i != S)
- ์งํ์ด ๊ฑธ๋ฆฌ๋ ์๊ฐ๊ณผ ์ฑํ๊ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ํฉ์ด ์ต์๊ฐ ๋๋ ์ง์ ์ด์ด์ผ ํ๋ค. (min_distance_sum์ ์ต์๊ฐ์ผ๋ก ๊ฐฑ์ )
์ฒซ ๋ฒ์งธ for๋ฌธ์์ ๊ตฌํ min_distance_sum ๊ฐ์ ๋ ๋ฒ์งธ for๋ฌธ์ ์กฐ๊ฑด์ผ๋ก ์ฌ์ฉํ๋ค.
- ๋ ๋ฒ์งธ for๋ฌธ : ์ ์ ํ ์ฝ์ ์ง์ ์ ํ์ํ๋ค.
- ๋ฌธ์ ์กฐ๊ฑด์ 3, 4์ ๋ถํฉํ๋ ์ง์ ์ ์ฐพ๊ณ ์ ํ๋ค.
- ์ฝ์ ์ง์ ์ ์งํ๊ณผ ์ฑํ์ ์์น๊ฐ ๋ ์ ์์ผ๋ฉฐ (i != J and i != S)
- ์งํ์ด๊ฐ ์ฑํ๋ณด๋ค ๋ ๊ฐ๊น๊ฑฐ๋ ๊ฐ์ผ๋ฉด์(jd <= sd) & ๋ ์ฌ๋์ด ๊ฐ์ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ํฉ์ด ์ต์๊ฐ์ด๋ฉด์
- ํ์ฌ ์ฝ์์ฅ์๋ณด๋ค ์งํ์ด์ ์์น์์ ๋ ๊ฐ๊น์ด ์ง์ ์ด ์๋ ๊ฒฝ์ฐ
- ํด๋น ์ง์ ์ ์ฝ์ ์ฅ์๋ก ์ ํ๋ค.
- for๋ฌธ์ V ~ 0๊น์ง ๋์ ๋ฒํธ๋ถํฐ ํ์ธํ๋ฉฐ ์กฐ๊ฑด์ ๋ถํฉํ๋ ์ง์ ์ด ์ฌ๋ฌ ๊ฐ์ธ ๊ฒฝ์ฐ ๋ฎ์ ๋ฒํธ๊ฐ ์ฝ์ ์ฅ์๋ก ์ ํด์ง ์ ์๋๋ก ํ๋ค.
- ๋ฌธ์ ์กฐ๊ฑด์ 3, 4์ ๋ถํฉํ๋ ์ง์ ์ ์ฐพ๊ณ ์ ํ๋ค.
728x90
'coding_test' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 2805. ๋๋ฌด ์๋ฅด๊ธฐ (ํ์ด์ฌ) (0) | 2025.04.14 |
---|---|
[๋ฐฑ์ค] 11660. ๊ตฌ๊ฐ ํฉ ๊ตฌํ๊ธฐ 5 (ํ์ด์ฌ) (0) | 2025.04.14 |
[๋ฐฑ์ค] 17609. ํ๋ฌธ (ํ์ด์ฌ) (0) | 2025.03.25 |
[๋ฐฑ์ค] 11945. ๋จ๊ฑฐ์ด ๋ถ์ด๋นต (ํ์ด์ฌ) (0) | 2025.03.08 |
[๋ฐฑ์ค] 2675. ๋ฌธ์์ด ๋ฐ๋ณต (ํ์ด์ฌ) (0) | 2025.03.07 |