본문 바로가기

알고리즘/백준

[백준] 4485번 : 녹색 옷 입은 애가 젤다지?

728x90

4485번: 녹색 옷 입은 애가 젤다지?

해당문제는 BFS혹은 데이크스트라로 문제를 해결 할 수 있습니다.

BFS는 N이 충분히 작고 가중치가 9이하 이기때문에 시간복잡도 안에 충분히 풀 수 있습니다. 하지만 N이 증가하고, 가중치가 증가한다면 BFS로는 시간복잡도내에 풀 수 없습니다.

해당 문제는 데이크스트라로 문제를 해결하였고, 우선순위 큐를 활용하여 최소 방문거리를 계산 하였습니다.

<aside> 💡 파이썬의 format 함수 : {}, {} 에 변수를 넣을 수 있다. 또한 소수점 개수를 출력하는 format을 사용하고 싶을 경우 {:.2f} 를 하게되면 소수점 자리가 2개 까지 가능하다.

</aside>

move = ((0,1), (1,0), (0,-1), (-1,0))
import heapq
cnt = 1
while True:
    N = int(input())
    if N == 0:
        break

    INF = N*N*9 + 1
    graph = [list(map(int, input().split())) for _ in range(N)]
    queue = []
    visit = [[INF for _ in range(N)] for _ in range(N)]
    visit[0][0] = 0
    heapq.heappush(queue, (graph[0][0], 0 ,0))
    while queue:
        cost, i, j = heapq.heappop(queue)

        if i == N-1 and j == N-1:
            break

        for dy, dx in move:
            ny, nx = dy + i, dx + j
            if N > ny >= 0 and N > nx >= 0 and visit[ny][nx] > cost + graph[ny][nx]: # 거리가 최단거리가 아닐경우 방문한다.
                newcost = cost + graph[ny][nx]
                visit[ny][nx] = newcost
                heapq.heappush(queue, (newcost, ny, nx))

    print("Problem {}: {}".format(cnt, visit[N-1][N-1]))
    cnt += 1
728x90

'알고리즘 > 백준' 카테고리의 다른 글

[백준] 9184번 : 신나는함수실행  (0) 2023.10.18
[백준] 1062번 : 가르침  (1) 2023.10.17
[백준] 1162번 : 도로포장  (0) 2023.10.17
[백준] 2696번 : 중앙값 구하기  (0) 2023.10.17
[백준] 2075번 : N번째큰수  (0) 2023.10.17