본문 바로가기

알고리즘/백준

[4485] 녹색 옷 입은 애가 젤다지?(python)

1. 문제

https://www.acmicpc.net/problem/4485

 

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

젤다의 전설 게임에서 화폐의 단위는 루피(rupee)다. 그런데 간혹 '도둑루피'라 불리는 검정색 루피도 존재하는데, 이걸 획득하면 오히려 소지한 루피가 감소하게 된다! 젤다의 전설 시리즈의 주

www.acmicpc.net

 

2. 풀이 과정

- (0,0) 에서 (N-1,N-1)까지 갈 때 최소 루피(비용)을 출력하는 문제

- 처음엔 다익스트라로 풀려 했는데, BFS로 풀게 되었다.

- 다익스트라는 "간선의 길이"가 중요한 문제, 즉 A번 -> C번 노드로 가는데 걸리는 "간선"의 비용이 어느정도인지가 주어지면 푸는 문제인데 해당 문제는 간선의 비용이 아니라 "특정 노드"에 도착했을 때 무조건 걸리는 비용이 주어졌으므로 BFS로 푸는게 더 낫다. 

- 또한, 다익스트라로 풀게 되면 각 좌표의 지점들을 모두 노드로 생각해서 풀어야 하므로, (0,0) , (0,1), (0,2)...(N-1,N-1)의 노드 개수(V)는 N&^2개, 간선 개수(E)는 N*N*(N-1)/2개가 된다.

- BFS로 풀게 되면 인접 행렬일 때 노드 개수는 V = N^2개가 된다. 

    * 다익스트라의 시간복잡도 : O(Elog∣V)

    * BFS의 시간복잡도 : 인접 행렬일 때 

이므로, 다익스트라의 시간복 

 

3. 새로안 것 & 실수한 것 

- 파이썬은  매개변수로 인자를 넘기지  않아도 되는 경우가 있다

- from heapq import heappush, heappop으로 불렀으면 heappush, heappop으로 사용해야하고, 

import heapq로 불렀으면 heapq.heqppush, heapq.heappop으로 사용해야 한다.

 

4. 코드

더보기
#녹색 옷 입은 애가 젤다지?
#다익스트라는 간선 길이가 핵심( 특정 노드 사이의 거리)
#얜 간선의 길이가 아니라 그 "노드"로 가는 비용
#얘를 다익스트라로 N * M * 4(상하좌우) 크기로 넣어주어ㅑ 함

from heapq import heappush, heappop
import sys
input = sys.stdin.readline
INF = int(97654321)

dx = [-1,0,1,0]
dy = [0,1,0,-1]
cnt = 1

def bfs():
    q = []
    heappush(q,(graph[0][0],0,0))
    distance[0][0] = 0

    while q:
        cost, x, y = heappop(q)

        if x == (N-1) and y == (N-1):
            print(f'Problem {cnt}: {distance[x][y]}')
            break

        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            
            if nx < 0 or nx >= N or ny < 0 or ny >= N:
                continue
            else:
                nc = cost + graph[nx][ny]
                
                if nc < distance[nx][ny]:
                    distance[nx][ny] = nc
                    heappush(q,(nc,nx,ny))

while True:
    N = int(input())
    if N == 0:
        break
    
    graph = [ list(map(int, input().split())) for _ in range(N)]
    distance = [ [INF] * N for _ in range(N)]
    bfs()
    cnt += 1

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

[12847] 꿀 아르바이트(python)  (0) 2021.09.15
[2110] 공유기 설치(python)  (0) 2021.08.01
[18111] 마인크래프트(python)  (0) 2021.08.01
[1654] 랜선 자르기(python)  (0) 2021.07.26
[9012]괄호  (0) 2020.12.10