https://www.acmicpc.net/problem/1520
1520번: 내리막 길
여행을 떠난 세준이는 지도를 하나 구하였다. 이 지도는 아래 그림과 같이 직사각형 모양이며 여러 칸으로 나뉘어져 있다. 한 칸은 한 지점을 나타내는데 각 칸에는 그 지점의 높이가 쓰여 있으
www.acmicpc.net
시작점(좌상단)에서 도착점(우하단)까지 갈 수 있는 경로의 경우의 수를 구하는 문제
현재 위치보다 더 낮은 숫자(높이)인 칸(지점)으로만 이동가능
[제약사항]
- 1 <= N, M <= 500
- 1 <= 각 지점의 높이 <= 10000
- 최대힙을 이용해 풀이했다.
- 시작점에서 출발하여 이동가능한 지점(높이가 더 낮은 지점)의 높이와 위치를 힙에 저장한다.
- 높이가 높은 점부터 방문하도록 최대힙으로 구현하여 특정지점에 도착할 수 있는 모든 경우의 수를 파악한 뒤 다음 지점으로 이동할 수 있도록 했다.
- 백준에서 살펴본 다른사람들의 풀이들이 거의 모두 재귀를 이용한 dfs + dp인 것을 보면 내 풀이는 정석은 아닌듯 하다..
from heapq import heapify, heappop, heappush
import sys
input = sys.stdin.readline
N, M = map(int, input().split())
board = [list(map(int, input().split())) for _ in range(N)]
drc = [(1, 0), (0, 1), (-1, 0), (0, -1)]
arr = [[0] * M for _ in range(N)]
arr[0][0] = 1
# 최대힙으로 사용하기 위해 높이를 음수로 저장
que = [(-board[0][0], 0, 0)]
while que:
height, r, c = heappop(que)
for dr, dc in drc:
nr, nc = r + dr, c + dc
# 갈수 있는 지점인지 확인
if not (0 <= nr < N and 0 <= nc < M) or board[nr][nc] >= board[r][c]:
continue
# 이미 방문한 지점인지 확인
# 방문한 적 없는 지점만 다음에 이동할 지점으로 추가해줌
if not arr[nr][nc]:
heappush(que, (-board[nr][nc], nr, nc))
# 경우의 수 추가
arr[nr][nc] += arr[r][c]
print(arr[-1][-1])
[백준/BOJ] #2718 타일 채우기.python(파이썬) (2) | 2022.06.06 |
---|---|
[백준/BOJ] #14889 스타트와 링크.python(파이썬) (0) | 2021.10.06 |
[백준/BOJ] #12100 2048 (Easy).python(파이썬) (0) | 2021.09.10 |
[백준/BOJ] #13460 구슬 탈출 2.python(파이썬) (0) | 2021.09.09 |
[백준/BOJ] #3190 뱀.python(파이썬) (0) | 2021.09.08 |