파이썬

[프로그래머스] 배달

운으로 2022. 6. 9. 00:49

https://programmers.co.kr/learn/courses/30/lessons/12978#

 

코딩테스트 연습 - 배달

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

programmers.co.kr

 

<코드>

def solution(N, road, K):
    cnt = 1
    INF = 500001
    adj = [[INF]*(N+1) for _ in range(N+1)]
    for food in road:
        s, e = food[0], food[1]
        if adj[s][e] > food[2]: # 이미 있는 길보다 적은 시간이 걸릴 경우
            adj[s][e] = food[2]
            adj[e][s] = food[2]                 
    
    hour = adj[1][:] # 1번 가게에서 직항으로 가는 가게들 걸리는 시간
    U = {1} # 방문한 가게들
    while len(U) < N+1:
        min_val = INF
        min_idx = 0
        
        for i in range(2, N+1): # 2번부터 N번까지의 가게 중에 가장 거리가 짧은 가게 찾는다
            if i not in U and hour[i] < min_val:
                min_val = hour[i]
                min_idx = i
        U.add(min_idx) # 방문한 가게에 넣어준다
        
        for j in range(2, N+1): # 1 -> A가게 보다 1-> 가장 짧은 가게 -> A가게가 더 짧을 경우 업데이트
            if j not in U and hour[min_idx] + adj[min_idx][j] < hour[j]:
                hour[j] = hour[min_idx] + adj[min_idx][j]
    
    for h in hour:
        if h <= K:
            cnt += 1
    
    return cnt

 

<풀이방법>

1. prim알고리즘으로 풀었는데 1번 가게에서 갈 수 있는 가장 짧은 거리를 갈 수 있는 가게를 찾는다.

2. 방문한 가게에 넣어주고 1번에서 A라는 가게를 갈 수 있는 경우보다 1번에서 가장 짧은 거리의 가게를 들렸다가 A라는 가게를 가는 경우가 더 짧을 경우 업데이트 해준다.

 

<리뷰>

prim 기억에서 사라지고 있었는데 다시 한번 문제를 풀면서 기억을 되살렸다.

여러 방법으로 풀 수 있는 문제라고 생각한다.