Bonfire

99클럽 코테 스터디 30일차 TIL Leetcode Minimum Cost of a Path With Special Roads 본문

알고리즘/99 코테 스터디

99클럽 코테 스터디 30일차 TIL Leetcode Minimum Cost of a Path With Special Roads

pecan 2024. 6. 27. 23:27

문제 & 조건

나의 코드

 

문제를 보는 순간 시작점과 끝점이 고정되고, 최단거리를 구하라는 걸 보자마자 다익스트라 알고리즘을 사용해야겠다는 생각이 들었다.

다만, 어떻게 짜야할지 고민을 하다, 그냥 좌표에 인덱스를 붙여서 평소에 쓰던 다익스트라 알고리즘을 적용 시키는 방법으로 진행하였다.
나의 접근 방법

1. 각 Special road의 좌표들과 시작,끝점을 set으로 중복 없이 구하고, index화 한다.

2. 각 좌표간 cost를 기록해둔 cost_map을 만든다.

3. dijkstra 알고리즘을 사용하여 최단거리를 구한다.
from heapq import *
class Solution:
    def minimumCost(self, start: List[int], target: List[int], specialRoads: List[List[int]]) -> int:
        coord_idx={}
        rev_coord={}
        coords=set()
        coords.add((start[0],start[1]))
        coords.add((target[0],target[1]))
        for x1,y1,x2,y2,cost in specialRoads:
            coords.add((x1,y1))
            coords.add((x2,y2))
        N=len(coords)
        start_idx=-1
        target_idx=-1
        idx=0
        while idx<N:
            for cx,cy in coords:
                coord_idx[idx]=(cx,cy)
                rev_coord[(cx,cy)]=idx
                if [cx,cy]==start:
                    start_idx=idx
                elif [cx,cy]==target:
                    target_idx=idx
                idx+=1
        def diff(a,b):
            return abs(a[0]-b[0])+abs(a[1]-b[1])
        road=[1e9 for _ in range(N)]
        cost_map=[[1e9 for _ in range(N)] for _ in range(N)]
        road[start_idx]=0
        

        for i in range(N):
            for j in range(N):
                cost_map[i][j]=min(diff(coord_idx[i],coord_idx[j]),cost_map[i][j])

        for x1,y1,x2,y2,cost in specialRoads:
            s=rev_coord[(x1,y1)]
            e=rev_coord[(x2,y2)]
            cost_map[s][e]=min(cost_map[s][e],cost)


        queue=[]
        heappush(queue,(0,start_idx))
        coords.discard(coord_idx[start_idx])
        while queue:
            acc,cur_coord=heappop(queue)
            coords.discard(coord_idx[cur_coord])
            if road[cur_coord]<acc:
                continue
            for xi,yi in coords:
                next_coord=rev_coord[(xi,yi)]
                if road[next_coord]>road[cur_coord]+cost_map[cur_coord][next_coord]:
                    road[next_coord]=road[cur_coord]+cost_map[cur_coord][next_coord]
                    heappush(queue,(road[cur_coord]+cost_map[cur_coord][next_coord],next_coord))
        
        return road[target_idx]

 

짧은 회고

사실 좌표별로 튜플화해서 바로 구하면 되는 방법을 쓰는게 더 효율적 방법이라 생각되긴했다.

그에 비해 내 코드는 괜히 좌표를 하나하나 저장하고  비효율적인 코드지만, 일단 이해하기 쉬운 코드로 작성해 본 시도는 잘 한 것 같다.