🐍 μ½”λ”©ν…ŒμŠ€νŠΈ λŒ€λΉ„ : PS

[ν”„λ‘œκ·Έλž˜λ¨ΈμŠ€] 배달 (level2, python)

개발자 HOON 2022. 10. 13. 22:02

πŸ› 문제 μ„€λͺ…

 

N개의 λ§ˆμ„λ‘œ 이루어진 λ‚˜λΌκ°€ μžˆμŠ΅λ‹ˆλ‹€. 이 λ‚˜λΌμ˜ 각 λ§ˆμ„μ—λŠ” 1λΆ€ν„° NκΉŒμ§€μ˜ λ²ˆν˜Έκ°€ 각각 ν•˜λ‚˜μ”© λΆ€μ—¬λ˜μ–΄ μžˆμŠ΅λ‹ˆλ‹€. 각 λ§ˆμ„μ€ μ–‘λ°©ν–₯으둜 톡행할 수 μžˆλŠ” λ„λ‘œλ‘œ μ—°κ²°λ˜μ–΄ μžˆλŠ”λ°, μ„œλ‘œ λ‹€λ₯Έ λ§ˆμ„ 간에 이동할 λ•ŒλŠ” 이 λ„λ‘œλ₯Ό μ§€λ‚˜μ•Ό ν•©λ‹ˆλ‹€. λ„λ‘œλ₯Ό 지날 λ•Œ κ±Έλ¦¬λŠ” μ‹œκ°„μ€ λ„λ‘œλ³„λ‘œ λ‹€λ¦…λ‹ˆλ‹€. ν˜„μž¬ 1번 λ§ˆμ„μ— μžˆλŠ” μŒμ‹μ μ—μ„œ 각 λ§ˆμ„λ‘œ μŒμ‹ 배달을 ν•˜λ €κ³  ν•©λ‹ˆλ‹€. 각 λ§ˆμ„λ‘œλΆ€ν„° μŒμ‹ 주문을 λ°›μœΌλ €κ³  ν•˜λŠ”λ°, N개의 λ§ˆμ„ μ€‘μ—μ„œ K μ‹œκ°„ μ΄ν•˜λ‘œ 배달이 κ°€λŠ₯ν•œ λ§ˆμ„μ—μ„œλ§Œ 주문을 λ°›μœΌλ €κ³  ν•©λ‹ˆλ‹€. λ‹€μŒμ€ N = 5, K = 3인 경우의 μ˜ˆμ‹œμž…λ‹ˆλ‹€.

 

 

μœ„ κ·Έλ¦Όμ—μ„œ 1번 λ§ˆμ„μ— μžˆλŠ” μŒμ‹μ μ€ [1, 2, 4, 5] 번 λ§ˆμ„κΉŒμ§€λŠ” 3 μ΄ν•˜μ˜ μ‹œκ°„μ— 배달할 수 μžˆμŠ΅λ‹ˆλ‹€. κ·ΈλŸ¬λ‚˜ 3번 λ§ˆμ„κΉŒμ§€λŠ” 3μ‹œκ°„ μ΄λ‚΄λ‘œ 배달할 수 μžˆλŠ” κ²½λ‘œκ°€ μ—†μœΌλ―€λ‘œ 3번 λ§ˆμ„μ—μ„œλŠ” 주문을 받지 μ•ŠμŠ΅λ‹ˆλ‹€. λ”°λΌμ„œ 1번 λ§ˆμ„μ— μžˆλŠ” μŒμ‹μ μ΄ 배달 주문을 받을 수 μžˆλŠ” λ§ˆμ„μ€ 4κ°œκ°€ λ©λ‹ˆλ‹€.


λ§ˆμ„μ˜ 개수 N, 각 λ§ˆμ„μ„ μ—°κ²°ν•˜λŠ” λ„λ‘œμ˜ 정보 road, μŒμ‹ 배달이 κ°€λŠ₯ν•œ μ‹œκ°„ Kκ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, μŒμ‹ 주문을 받을 수 μžˆλŠ” λ§ˆμ„μ˜ 개수λ₯Ό return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.


μ œν•œμ‚¬ν•­
  • λ§ˆμ„μ˜ 개수 N은 1 이상 50 μ΄ν•˜μ˜ μžμ—°μˆ˜μž…λ‹ˆλ‹€.
  • road의 길이(λ„λ‘œ μ •λ³΄μ˜ 개수)λŠ” 1 이상 2,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • road의 각 μ›μ†ŒλŠ” λ§ˆμ„μ„ μ—°κ²°ν•˜κ³  μžˆλŠ” 각 λ„λ‘œμ˜ 정보λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
  • roadλŠ” 길이가 3인 배열이며, μˆœμ„œλŒ€λ‘œ (a, b, c)λ₯Ό λ‚˜νƒ€λƒ…λ‹ˆλ‹€.
    • a, b(1 ≤ a, b ≤ N, a != b)λŠ” λ„λ‘œκ°€ μ—°κ²°ν•˜λŠ” 두 λ§ˆμ„μ˜ 번호이며, c(1 ≤ c ≤ 10,000, cλŠ” μžμ—°μˆ˜)λŠ” λ„λ‘œλ₯Ό μ§€λ‚˜λŠ”λ° κ±Έλ¦¬λŠ” μ‹œκ°„μž…λ‹ˆλ‹€.
    • 두 λ§ˆμ„ a, bλ₯Ό μ—°κ²°ν•˜λŠ” λ„λ‘œλŠ” μ—¬λŸ¬ κ°œκ°€ μžˆμ„ 수 μžˆμŠ΅λ‹ˆλ‹€.
    • ν•œ λ„λ‘œμ˜ 정보가 μ—¬λŸ¬ 번 μ€‘λ³΅ν•΄μ„œ 주어지지 μ•ŠμŠ΅λ‹ˆλ‹€.
  • KλŠ” μŒμ‹ 배달이 κ°€λŠ₯ν•œ μ‹œκ°„μ„ λ‚˜νƒ€λ‚΄λ©°, 1 이상 500,000 μ΄ν•˜μž…λ‹ˆλ‹€.
  • μž„μ˜μ˜ 두 λ§ˆμ„κ°„μ— 항상 이동 κ°€λŠ₯ν•œ κ²½λ‘œκ°€ μ‘΄μž¬ν•©λ‹ˆλ‹€.
  • 1번 λ§ˆμ„μ— μžˆλŠ” μŒμ‹μ μ΄ K μ΄ν•˜μ˜ μ‹œκ°„μ— 배달이 κ°€λŠ₯ν•œ λ§ˆμ„μ˜ 개수λ₯Ό return ν•˜λ©΄ λ©λ‹ˆλ‹€.

μž…μΆœλ ₯ 예
5 [[1,2,1],[2,3,3],[5,2,2],[1,4,2],[5,3,1],[5,4,2]] 3 4
6 [[1,2,1],[1,3,2],[2,3,2],[3,4,3],[3,5,2],[3,5,3],[5,6,1]] 4 4

μž…μΆœλ ₯ 예 μ„€λͺ…

 

μž…μΆœλ ₯ 예 #1
문제의 μ˜ˆμ‹œμ™€ κ°™μŠ΅λ‹ˆλ‹€.

 

μž…μΆœλ ₯ 예 #2
주어진 λ§ˆμ„κ³Ό λ„λ‘œμ˜ λͺ¨μ–‘은 μ•„λž˜ κ·Έλ¦Όκ³Ό κ°™μŠ΅λ‹ˆλ‹€.

 


1번 λ§ˆμ„μ—μ„œ 배달에 4μ‹œκ°„ μ΄ν•˜κ°€ κ±Έλ¦¬λŠ” λ§ˆμ„μ€ [1, 2, 3, 5] 4κ°œμ΄λ―€λ‘œ 4λ₯Ό return ν•©λ‹ˆλ‹€.


πŸ› 풀이 μ½”λ“œ

import heapq

def dijkstra(start, distance, graph):
    heap = []
    heapq.heappush(heap, (0, start))
    distance[start] = 0
    
    while heap:
        dist, now = heapq.heappop(heap)
        for i in graph[now]:
            cost = dist + i[0]
            if cost < distance[i[1]]:
                distance[i[1]] = cost
                heapq.heappush(heap, (cost, i[1]))
                
    return distance

                
def solution(N, road, K):
    INF = int(1e10)
    distance = [INF for _ in range(N+1)]
    graph = [[] for _ in range(N+1)]
    
    for r in road:
        atown, btown, time_cost = r
        graph[atown].append([time_cost, btown])
        graph[btown].append([time_cost, atown])
        
    distance = dijkstra(1, distance, graph)
    answer = len([dis for dis in distance[1:] if dis <= K])

    return answer

 

λ‹€μ΅μŠ€νŠΈλΌλ‘œ 문제λ₯Ό ν•΄κ²°ν–ˆλ‹€. level2인 μ΄μœ λŠ” 잘 λͺ¨λ₯΄κ² λ‹€.. λ„ˆλ¬΄ κΈ°λ³Έν˜•μ΄λΌμ„œ κ·ΈλŸ°κ°€?

μ‹œμž‘ λ…Έλ“œλ‘œλΆ€ν„° 각 λ…Έλ“œκΉŒμ§€μ˜ μ΅œλ‹¨κ±°λ¦¬λ₯Ό κ΅¬ν•˜λŠ” 문제이기 λ•Œλ¬Έμ— λ‹€μ΅μŠ€νŠΈλΌλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 제일 μ μ ˆν•΄ λ³΄μ˜€λ‹€.

 

μΆœλ°œμ§€λ‘œλΆ€ν„°μ˜ 거리인 distance 배열을 λͺ¨λ‘ INF둜 μ΄ˆκΈ°ν™”ν•˜κ³ , μΈμ ‘λ¦¬μŠ€νŠΈ graphλ₯Ό μƒμ„±ν•œλ‹€.

atownκ³Ό btownκ³Ό time_costλ₯Ό μΈμ ‘λ¦¬μŠ€νŠΈμ— [time_cost, town_name]으둜 μ‚½μž…ν•œλ‹€.

 

λ‹€μ΅μŠ€νŠΈλΌ μ•Œκ³ λ¦¬μ¦˜μ€ μ—­μ‹œ νž™μ„ μ‚¬μš©ν•˜λ©°,

λ½‘μ•„μ„œ μΈμ ‘λ…Έλ“œλ“€ νƒμƒ‰ν•˜κ³ , 인접 λ…Έλ“œμ™€ μ—°κ²°λœ κ°€μ€‘μΉ˜λ₯Ό λ”ν–ˆλ”λ‹ˆ 더 μž‘μœΌλ©΄ κ°±μ‹ ν•˜κ³  νž™μ— λ„£μ–΄ λ‹€μŒμ— μ΄λ™μ‹œν‚€κ³ ,

더 크면 κ·Έλƒ₯ λ„˜κΈ°λŠ” λ°©μ‹μœΌλ‘œ distance 배열을 κ³„μ†ν•΄μ„œ μ—…λ°μ΄νŠΈν•œλ‹€.

 

μ΅œμ’…μ μœΌλ‘œ K보닀 μž‘μ€ λΉ„μš©μ„ 가진 λ§ˆμ„μ˜ 개수λ₯Ό μ„Έλ©΄ 정닡이닀.