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

2023. 8. 20. 14:19·Problem Solving/Baekjoon

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

 

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

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

www.acmicpc.net

 

 

첫 접근은 최단 경로를 구하는 문제라고 생각해서 BFS를 사용했다. 하지만 테스트 케이스조차 통과하지 못하였고 힌트를 얻어 다익스트라 알고리즘을 사용하는 것을 파악했다. 출발지 (0,0)에서 목적지 (n-1, n-1)까지 최단 비용을 사용하여 목적지에 도달해야 한다. 그러기 위해서는 무작정 출발지에서 최소 비용을 따라갈 것이 아니라 지속적인 갱신이 필요하다. 

 

파란색 경로는 갱신 없이 최소 비용만을 따라갔을 때의 비용 = 20

빨간색 경로는 해당 좌표의 최소 비용을 갱신하면서 따라갔을 때의 비용 = 19

 

이와 같이 다익스트라 알고리즘을 사용하면 BFS를 사용한 것 보다 더 적은 비용으로 목적지까지 도달할 수 있다.

내 풀이 : 368ms

import itertools
import sys, heapq
si = sys.stdin.readline
from collections import defaultdict, deque, Counter
from bisect import bisect_left, bisect_right
from math import factorial,sqrt
from itertools import permutations, combinations, accumulate
mn, mx = float('inf'), float('-inf')
dir = [[1,0],[0,1],[0,-1],[-1,0]]
def bfs(a,b,graph,cost) :
    q = deque([])
    q.append((a,b))
    while q :
        x,y=q.popleft()
        for i in range(4):
            nx = x + dir[i][0]
            ny = y + dir[i][1]
            if 0 <= nx < n and 0 <= ny < n :
                if cost[nx][ny] > cost[x][y] + graph[nx][ny] :
                    cost[nx][ny] = cost[x][y] + graph[nx][ny]
                    q.append((nx,ny))

i = 1
while True :
    n = int(si())
    if n == 0 : break
    graph = []
    cost = [[float('inf') for _ in range(n)] for _ in range(n)]
    for _ in range(n) :
        lst = list(map(int, si().split()))
        graph.append(lst)
    cost[0][0] = graph[0][0]
    bfs(0,0,graph,cost)
    print("Problem %d: %d"%(i,cost[n-1][n-1]))
    i += 1

 

여기서 개선된 다익스트라 알고리즘을 사용해보았다. 힙큐(우선순위 큐)를 사용하여 최소 비용순으로 데이터를 꺼내 계산 횟수를 줄였다. 시간이 거의 3배 차이가 나는 것을 볼 수 있다. 

 

heapq를 사용한 풀이 : 132ms

import sys, heapq
si = sys.stdin.readline
from collections import defaultdict, deque, Counter
INF = float('inf')
dir = [[1,0],[0,1],[0,-1],[-1,0]]
def bfs(a,b,c) :
    # q = deque([])
    # q.append((a,b))
    q = [[c, a, b]]
    while q :
        # x,y=q.popleft()
        w, x, y = heapq.heappop(q)
        for i in range(4):
            nx = x + dir[i][0]
            ny = y + dir[i][1]
            if 0 <= nx < n and 0 <= ny < n :
                if cost[nx][ny] > w + graph[nx][ny] :
                    cost[nx][ny] = w + graph[nx][ny]
                    heapq.heappush(q,[cost[nx][ny], nx, ny])

i = 1
while True :
    n = int(si())
    if n == 0 : break
    cost = [[INF for _ in range(n)] for _ in range(n)]
    graph = []
    for _ in range(n) :
        graph.append(list(map(int, si().split())))

    bfs(0,0, graph[0][0])
    print("Problem %d: %d"%(i,cost[n-1][n-1]))
    i += 1
'''
3
5 5 4
3 9 1
3 2 7
5
3 7 2 0 1
2 8 0 9 1
1 2 1 8 1
9 8 9 2 0
3 6 5 1 5
7
9 0 5 1 1 5 3
4 1 2 1 6 5 3
0 7 6 1 6 8 5
1 1 7 8 3 2 3
9 4 0 7 6 4 1
5 8 3 2 4 8 3
7 4 8 4 8 3 4
0
'''
'Problem Solving/Baekjoon' 카테고리의 다른 글
  • [BOJ] 1991번: 트리 순회
  • [BOJ] 2252번 : 줄 세우기
  • [BOJ] 3085번: 사탕 게임
  • [BOJ] 1476번: 날짜 계산
kimdozzi
kimdozzi
끝까지 포기하지 않으면, 내가 다 이겨!
  • kimdozzi
    도브로
    kimdozzi
  • 전체
    오늘
    어제
    • 분류 전체보기 (132)
      • Problem Solving (49)
        • Baekjoon (29)
        • Programmers (0)
        • LeetCode (17)
        • 삼성 유형 (2)
      • Computer Science (27)
        • Operating System (2)
        • Algorithms (13)
        • Network (6)
        • DataBase (6)
      • Backend (33)
        • JavaScript (0)
        • TypeScript (6)
        • Java (7)
        • Spring Boot (7)
        • Spring Security (6)
        • JPA (2)
        • Mybatis (1)
        • Junit5 (1)
        • Redis (3)
      • DevOps (14)
        • Git, Github (5)
        • docker (4)
        • AWS (3)
        • nginx (2)
      • etc (6)
        • IntelliJ (3)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
    • 티스토리
    • 설정
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    PrefixSum
    파이썬
    도커
    Bucket
    S3
    imos법
    인덱스 시그니처
    구간합
    TypeScript
    docker image
    구간 업데이트
    온라인 쿼리
    인터페이스
    알고리즘
    누적합
    컨테이너
    타입스크립트
    인덱서블 타입
    오프라인 쿼리
    세그먼트 트리
    백준
    오블완
    삼성기출
    점 업데이트
    python
    CORS
    docker
    interface
    티스토리챌린지
    segment tree
    AWS
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.0
kimdozzi
[BOJ] 4485번 : 녹색 옷 입은 애가 젤다지?
상단으로

티스토리툴바