๊ด€๋ฆฌ ๋ฉ”๋‰ด

๐Ÿฆ• ๊ณต๋ฃก์ด ๋˜์ž!

์ตœ๋‹จ๊ฒฝ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ถ”๊ฐ€์ •๋ฆฌ ๋ณธ๋ฌธ

Development/CodingTest

์ตœ๋‹จ๊ฒฝ๋กœ ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์ถ”๊ฐ€์ •๋ฆฌ

Kirok Kim 2022. 2. 14. 23:56

๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜

  • ํŠน์ • ๋…ธ๋“œ์—์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ์Œ์˜ ๊ฐ„์„ ์ด ์—†์„ ๋•Œ ์ •์ƒ์ ์œผ๋กœ ๋™์ž‘
    • ํ˜„์‹ค ์„ธ๊ณ„์˜ ๋„๋กœ(๊ฐ„์„ )์€ ์Œ์˜ ๊ฐ„์„ ์œผ๋กœ ํ‘œํ˜„๋˜์ง€ ์•Š์Œ
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์ตœ๋‹จ ๊ฒฝ๋กœ ์•Œ๊ณ ๋ฆฌ์ฆ˜์€ ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜์œผ๋กœ ๋ถ„๋ฅ˜(DP๋กœ๋„ ๋ถ„๋ฅ˜๊ฐ€ ๋˜๊ธฐ๋„ ํ•จ)
    • ๋งค ์ƒํ™ฉ์—์„œ ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด ์ž„์˜์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณต

์ „์ฒด์ ์ธ ํ๋ฆ„

  1. ์ถœ๋ฐœ ๋…ธ๋“œ ์„ค์ •
  2. ์ถœ๋ฐœ ๋…ธ๋“œ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ฐ ๋…ธ๋“œ์˜ ์ตœ์†Œ ๋น„์šฉ ์ €์žฅ
  3. ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒ
  4. ํ•ด๋‹น ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ํŠน์ •ํ•œ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๊ฒฝ์šฐ๋ฅผ ๊ณ ๋ คํ•˜์—ฌ ์ตœ์†Œ ๋น„์šฉ์„ ๊ฐฑ์‹ 
  5. ์œ„ ๊ณผ์ • 3~4๋ฅผ ๋ฐ˜๋ณต
  • ์•Œ๊ณ ๋ฆฌ์ฆ˜ ๋™์ž‘ ๊ณผ์ •์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์€ ๊ฐ ๋…ธ๋“œ์— ๋Œ€ํ•œ ํ˜„์žฌ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Œ
  • ์ฒ˜๋ฆฌ ๊ณผ์ •์—์„œ ๋” ์งง์€ ๊ฒฝ๋กœ๋ฅผ ์ฐพ์œผ๋ฉด ‘์ด์ œ๋ถ€ํ„ฐ๋Š” ์ด ๊ฒฝ๋กœ๊ฐ€ ์ œ์ผ ์งง์€ ๊ฒฝ๋กœ์•ผ'๋ผ๊ณ  ๊ฐฑ์‹ ํ•จ
  • ๊ทธ๋ฆฌ๋”” ์•Œ๊ณ ๋ฆฌ์ฆ˜ : ๋งค ์ƒํ™ฉ์—์„œ ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๊ฐ€์žฅ ๋น„์šฉ์ด ์ ์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•ด ์ž„์˜์˜ ๊ณผ์ •์„ ๋ฐ˜๋ณตํ•จ
    • ๋‹จ๊ณ„๋ฅผ ๊ฑฐ์น˜๋ฉฐ ํ•œ ๋ฒˆ ์ฒ˜๋ฆฌ๋œ ๋…ธ๋“œ์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋Š” ๊ณ ์ •๋˜์–ด ๋” ์ด์ƒ ๋ฐ”๋€Œ์ง€ ์•Š์Œ
  • ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰ํ•œ ๋’ค์— ํ…Œ์ด๋ธ”์— ๊ฐ ๋…ธ๋“œ๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ์ •๋ณด๊ฐ€ ์ €์žฅ๋จ
    • ์™„๋ฒฝํ•œ ํ˜•ํƒœ์˜ ์ตœ๋‹จ ๊ฒฝ๋กœ๋ฅผ ๊ตฌํ•˜๋ ค๋ฉด ์†Œ์Šค์ฝ”๋“œ์— ์ถ”๊ฐ€์ ์ธ ๊ธฐ๋Šฅ์„ ๋” ๋„ฃ์–ด์•ผํ•จ
  • ๊ฐ„๋‹จํ•œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ•
    • ๋‹จ๊ณ„๋งˆ๋‹ค ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ์„ ํƒํ•˜๊ธฐ ์œ„ํ•ด ๋งค ๋‹จ๊ณ„๋งˆ๋‹ค 1์ฐจ์› ํ…Œ์ด๋ธ”์˜ ๋ชจ๋“  ์›์†Œ๋ฅผ ํ™•์ธ(์ˆœ์ฐจ ํƒ์ƒ‰)ํ•œ๋‹ค.
    ex) ๋ฐฉ๋ฌธ์„ ํ•ด์„œ ์ตœ์†Ÿ๊ฐ’์œผ๋กœ ๋ฐ”๊พธ๊ธฐ
    ๋…ธ๋“œ ๋ฒˆํ˜ธ 1 2 3 4 5
    ๊ฒฝ๋กœ ๊ฐ’ 0 ๋ฌดํ•œ ๋ฌดํ•œ ๋ฌดํ•œ ๋ฌดํ•œ
  • import sys
    input=sys.stdin.readline
    INF=int(1e9) # ๋ฌดํ•œ์„ ์˜๋ฏธํ•˜๋Š” ๊ฐ’์œผ๋กœ 10์–ต์„ ์„ค์ •
    
    # ๋…ธ๋“œ์˜ ๊ฐœ์ˆ˜, ๊ฐ„์„ ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
    n,m=map(int,input().split())
    
    # ์‹œ์ž‘ ๋…ธ๋“œ ๋ฒˆํ˜ธ๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
    start=int(input())
    
    # ๊ฐ ๋…ธ๋“œ์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๋…ธ๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋‹ด๋Š” ๋ฆฌ์ŠคํŠธ๋ฅผ ๋งŒ๋“ค๊ธฐ
    graph=[[] for i in range(n+1)]
    
    # ๋ฐฉ๋ฌธํ•œ ์ ์ด ์žˆ๋Š”์ง€ ์ฒดํฌํ•˜๋Š” ๋ชฉ์ ์˜ ๋ฆฌ์ŠคํŠธ ๋งŒ๋“ค๊ธฐ
    visited=[False] *(n+1)
    
    # ์ตœ๋‹จ ๊ฑฐ๋ฆฌ ํ…Œ์ด๋ธ”์„ ๋ชจ๋‘ ๋ฌดํ•œ์œผ๋กœ ์„ ์–ธ
    dis=[INF]*(n+1)
    
    # ๋ชจ๋“  ๊ฐ„์„  ์ •๋ณด๋ฅผ ์ž…๋ ฅ๋ฐ›๊ธฐ
    for _ in range(m):
    	a,b,c=map(int,input().split())  
    	
    	# a๋ฒˆ ๋…ธ๋“œ์—์„œ b๋ฒˆ ๋…ธ๋“œ๋กœ ๊ฐ€๋Š” ๋น„์šฉ์ด c๋ผ๋Š” ์˜๋ฏธ
    	graph[a].append((b,c))
     
    # ๋ฐฉ๋ฌธํ•˜์ง€ ์•Š์€ ๋…ธ๋“œ ์ค‘์—์„œ, ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ์˜ ๋ฒˆํ˜ธ๋ฅผ ๋ฐ˜ํ™˜
    def get_smallest_node():
    	min_value=INF
    	index=0 # ๊ฐ€์žฅ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ์งง์€ ๋…ธ๋“œ(์ธ๋ฑ์Šค)
    	for i in range(1,n+1):
    		if distance[i] < min_value and not visited[i]:
    			min_value = distance[i]
    			index = i
    	return index
    
    def dijkstart(start):
    	# ์‹œ์ž‘ ๋…ธ๋“œ์— ๋Œ€ํ•ด์„œ ์ดˆ๊ธฐํ™”
    	distance[start] = 0
    	visited[start] = True
    	for j in graph[start]:
    		dis[j[0]] = j[1]
    	# ์‹œ์ž‘ ๋…ธ๋“œ๋ฅผ ์ œ์™ธํ•œ ์ „์ฒด n-1 ๊ฐœ์˜ ๋…ธ๋“œ์— ๋Œ€ํ•ด ๋ฐ˜๋ณต
    	for i in range(n-1):
    		# ํ˜„์žฌ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๊ฐ€ ๊ฐ€์žฅ ์งง์€ ๋…ธ๋“œ๋ฅผ ๊บผ๋‚ด์„œ, ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
    		now = get_smallest_node()
    		visited[now] = True
    		# ํ˜„์žฌ ๋…ธ๋“œ์™€ ์—ฐ๊ฒฐ๋œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋ฅผ ํ™•์ธ
    		for j in graph[now]:
    			cost=dis[now] +j[1]
    			# ํ˜„์žฌ ๋…ธ๋“œ๋ฅผ ๊ฑฐ์ณ์„œ ๋‹ค๋ฅธ ๋…ธ๋“œ๋กœ ์ด๋™ํ•˜๋Š” ๊ฑฐ๋ฆฌ๊ฐ€ ๋” ์งง์€ ๊ฒฝ์šฐ
    			if cost < dis[j[0]]:
    				dis[j[0]]=cost
    # ๋‹ค์ต์ŠคํŠธ๋ผ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ˆ˜ํ–‰
    dijkstra(start)
    
    # ๋ชจ๋“  ๋…ธ๋“œ๋กœ ๊ฐ€๊ธฐ ์œ„ํ•œ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    for i in range(1,n+1):
    	# ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ, ๋ฌดํ•œ(INF)๋ผ๊ณ  ์ถœ๋ ฅ
    	if distance[i] ==INF:
    		print('INFINITY')
    	# ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฑฐ๋ฆฌ๋ฅผ ์ถœ๋ ฅ
    	else:
    		print(dis[i])
    
๋ฐ˜์‘ํ˜•
Comments