Algorithm/BOJ
[BOJ] 1520번 내리막 길
Dortmoot
2022. 6. 10. 13:07
[BOJ] 1520번 내리막 길
처음에는 DP와 BFS로 푸는 문제로 접근하였다.
생각하였던 예시 중에서는 올바르게 동작하였으나, 제출 시 시간 초과가 걸려 실패하였다.
왜 그런지 곰곰히 생각해보던 도중 BFS로 구현을 하게 되면 순차적으로 탐색을 하게 되어 돌아서 가는 경우에 대해서 갱신하여 처리하기 어렵다.
따라서 어차피 숫자 가중치에 따라 더 큰것부터 우선으로 찾아 들어가야하기 때문에 BFS의 Queue를 우선순위 Queue로 구현해볼까라고 생각하였다.
https://www.acmicpc.net/problem/1520
1520번: 내리막 길
여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으
www.acmicpc.net
알고리즘
1. BFS로 탐색 구현
2. 탐색 시 우선 순위 Queue에 남아있는 값중 제일 큰 값부터 순차적으로 적용
3. 해당되는 값을 각 영역별로 갯수 저장(주의점 이미 반영되었다면 , 우선 순위 Queue에는 다시 넣으면 안된다)
4. 탐색이 종료되면, 마지막 영역에 대해 값 출력
코드
#BOJ 1520번
import heapq
dx , dy = [0,0,-1,1] , [1,-1,0,0]
n , m = map(int,input().split())
maps = [list(map(int,input().split())) for _ in range(n)]
dp = [[0]*m for _ in range(n)]
dp[0][0]=1
q = []
heapq.heappush( q , (-maps[0][0] ,0,0) )
while q :
current,x,y= heapq.heappop(q)
current = -1*current
for i in range(4):
nx , ny = x+dx[i] , y+dy[i]
if 0<=nx<n and 0<=ny<m and maps[nx][ny] < current :
if dp[nx][ny]==0 :
heapq.heappush( q , (-maps[nx][ny],nx,ny))
dp[nx][ny] += dp[x][y]
print(dp[-1][-1])