๐Ÿ‹ โšพ๏ธ ๐Ÿ’ป ๐ŸŽฌ ๐ŸŽฎ

coding_test

[๋ฐฑ์ค€] 17270. ์—ฐ์˜ˆ์ธ์€ ํž˜๋“ค์–ด (ํŒŒ์ด์ฌ)

aeightchill 2025. 3. 27. 00:41
728x90

๐Ÿ—‚๏ธ   ๋ฌธ์ œ 

17270. ์—ฐ์˜ˆ์ธ์€ ํž˜๋“ค์–ด



๐Ÿ“Œ   Point

Dijkstra

๊ทธ๋ž˜ํ”„์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ์˜ ๋…ธ๋“œ๊ฐ€ ์žˆ์„ ๋•Œ, ํŠน์ • ๋…ธ๋“œ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฐ๊ฐ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์ฃผ๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ํ•œ ์ง€์ ์—์„œ ๋‹ค๋ฅธ ํŠน์ • ์ง€์ ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•œ๋‹ค.

 
ํŠน์ง•

  • ์Œ(-)์˜ ๊ฐ„์„ ์ด ์—†์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘
  • โ€˜๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌโ€™ ์ •๋ณด๋ฅผ ํ•ญ์ƒ 1์ฐจ์› ๋ฆฌ์ŠคํŠธ์— ์ €์žฅํ•˜๋ฉฐ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ณ„์† ๊ฐฑ์‹ 

 
์ž‘๋™ ๋ฐฉ์‹

  1. ์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ ์„ค์ •ํ•œ๋‹ค.
  2. ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ์ดˆ๊ธฐํ™”ํ•œ๋‹ค.
  3. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•œ๋‹ค.
  4. ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์„ ๊ณ„์‚ฐํ•˜์—ฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๊ฐฑ์‹ ํ•œ๋‹ค.
  5. ์œ„ ๊ณผ์ •์—์„œ 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. ๋ฌธ์ œ ์กฐ๊ฑด์˜ 1, 2์— ๋ถ€ํ•ฉํ•˜๋Š” ์ง€์ ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.
    2. ์•ฝ์† ์ง€์ ์€ ์ง€ํ—Œ๊ณผ ์„ฑํ•˜์˜ ์œ„์น˜๊ฐ€ ๋  ์ˆ˜ ์—†์œผ๋ฉฐ (i != J and i != S)
    3. ์ง€ํ—Œ์ด ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„๊ณผ ์„ฑํ•˜๊ฐ€ ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ ํ•ฉ์ด ์ตœ์†Œ๊ฐ€ ๋˜๋Š” ์ง€์ ์ด์–ด์•ผ ํ•œ๋‹ค. (min_distance_sum์„ ์ตœ์†Œ๊ฐ’์œผ๋กœ ๊ฐฑ์‹ )

 
์ฒซ ๋ฒˆ์งธ for๋ฌธ์—์„œ ๊ตฌํ•œ min_distance_sum ๊ฐ’์„ ๋‘ ๋ฒˆ์งธ for๋ฌธ์˜ ์กฐ๊ฑด์œผ๋กœ ์‚ฌ์šฉํ•œ๋‹ค.
 

  • ๋‘ ๋ฒˆ์งธ for๋ฌธ   :   ์ ์ ˆํ•œ ์•ฝ์† ์ง€์ ์„ ํƒ์ƒ‰ํ•œ๋‹ค.
    • ๋ฌธ์ œ ์กฐ๊ฑด์˜ 3, 4์— ๋ถ€ํ•ฉํ•˜๋Š” ์ง€์ ์„ ์ฐพ๊ณ ์ž ํ•œ๋‹ค.
      1. ์•ฝ์† ์ง€์ ์€ ์ง€ํ—Œ๊ณผ ์„ฑํ•˜์˜ ์œ„์น˜๊ฐ€ ๋  ์ˆ˜ ์—†์œผ๋ฉฐ (i != J and i != S)
      2. ์ง€ํ—Œ์ด๊ฐ€ ์„ฑํ•˜๋ณด๋‹ค ๋” ๊ฐ€๊น๊ฑฐ๋‚˜ ๊ฐ™์œผ๋ฉด์„œ(jd <= sd) & ๋‘ ์‚ฌ๋žŒ์ด ๊ฐ์ž ๊ฑธ๋ฆฌ๋Š” ์‹œ๊ฐ„์˜ ํ•ฉ์ด ์ตœ์†Ÿ๊ฐ’์ด๋ฉด์„œ
      3. ํ˜„์žฌ ์•ฝ์†์žฅ์†Œ๋ณด๋‹ค ์ง€ํ—Œ์ด์˜ ์œ„์น˜์—์„œ ๋” ๊ฐ€๊นŒ์šด ์ง€์ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ
      4. ํ•ด๋‹น ์ง€์ ์„ ์•ฝ์† ์žฅ์†Œ๋กœ ์ •ํ•œ๋‹ค.
    • for๋ฌธ์€ V ~ 0๊นŒ์ง€ ๋†’์€ ๋ฒˆํ˜ธ๋ถ€ํ„ฐ ํ™•์ธํ•˜๋ฉฐ ์กฐ๊ฑด์— ๋ถ€ํ•ฉํ•˜๋Š” ์ง€์ ์ด ์—ฌ๋Ÿฌ ๊ฐœ์ธ ๊ฒฝ์šฐ ๋‚ฎ์€ ๋ฒˆํ˜ธ๊ฐ€ ์•ฝ์† ์žฅ์†Œ๋กœ ์ •ํ•ด์งˆ ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.

 
 
 
 
 

728x90