티스토리 뷰
728x90
반응형
문제
N*N 크기의 게임판이 있을 때, (0, 0)에서 (N-1, N-1)까지 규칙(조건)에 맞게 이동할 수 있는 경로의 수를 구하는 문제이다.
< 그림 1 >
문제 조건
- 각 칸에는 한 번에 이동 가능한 거리가 쓰임
- 반드시 오른쪽 혹은 아래쪽으로 이동
풀이
- 문제의 조건을 주의해야 한다. (오른쪽과 아래쪽으로만 한 번에 직선 이동 가능)
- 오른쪽과 아래쪽으로만 이동 가능하기 때문에 왼쪽 위의 경로의 수를 먼저 구하고 해당 경로의 수를 활용하여 다음 위치의 경로의 수를 구할 수 있다. 즉, DP를 활용할 수 있다.
- 위의 그림은 < 그림 1 > 의 예시의 풀이 과정을 시각화한 것이다.
- 각 칸을 방문하면서 게임판의 범위 내에서 이동 가능한 거리라면, DP에 저장되어 있는 현재 위치까지 도달하는데 가능한 경로의 수를 다음 위치에 더해준다.
- 값이 0인 칸은 이동할 수 없다는 점을 유의해야 한다.
- 모든 칸에서의 이동이 끝나면 자동으로 각 칸에 도달하는 경로의 수가 DP에 담기게 된다.
알고리즘
- 경로의 수를 담아둘 DP를 0으로 초기화한다.
- 출발지인 (0, 0) 의 경로의 수를 1로 설정한다.
- 모든 칸을 방문하면서 각 칸에서 조건에 맞게 도달할 수 있는 칸이 존재한다면, 현재 칸의 경로의 수를 다음 칸의 경로의 수에 더한다.
- 가장 오른쪽 아래 칸 (n-1, n-1) 의 경로의 수를 출력한다.
Python 코드
import sys
input = sys.stdin.readline
n = int(input()) # row의 길이
board = [input().split() for _ in range(n)]
m = len(board[0]) # col의 길이
dp = [[0]*m for _ in range(n)]
dp[0][0]=1
def sol():
for i in range(n):
for j in range(m):
k = int(board[i][j])
# 이동 가능한 거리가 0이라면 넘어간다.
# 또는 dp가 0이라는 것은 현재 위치에 도달할 수 없음을 의미함으로 넘어간다.
if k == 0 or dp[i][j] == 0:
continue
if i+k < n: # 아래쪽으로 이동하는 경우, 게임판을 벗어나지 않는다면 경우의 수 추가
dp[i+k][j] += dp[i][j]
if j+k < m: # 오른쪽으로 이동하는 경우, 게임판을 벗어나지 않는다면 경우의 수 추가
dp[i][j+k] += dp[i][j]
return dp[-1][-1] # 가장 오른쪽 아래에 담긴 경우의 수를 return
print(sol())
문제 출처
728x90
반응형
'Study > Coding Test' 카테고리의 다른 글
[백준 BOJ / Python] 1965번 상자넣기 DP (0) | 2023.02.06 |
---|---|
[백준 BOJ / Python] 25338번 바지 구매 math (0) | 2023.02.01 |
[백준 BOJ / Python] 17404번 RGB거리 2 DP (0) | 2023.01.30 |
[백준 BOJ / Python] 1149번 RGB거리 DP (0) | 2023.01.28 |
[백준 BOJ / Python] 2565번 전깃줄 DP (0) | 2023.01.18 |
댓글
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 | 31 |
TAG
- MySQL
- 코딩테스트실력진단
- 알고리즘
- 이분탐색
- lis
- disjoint set
- 파이썬
- 그리디
- COLAB
- 코드트리
- 백준
- padding mask
- greedy
- Prefix sum
- 누적합
- dfs
- pytorch
- FastAPI
- 트랜스포머
- DP
- boj
- python
- 수학
- 구현
- Look-ahead Mask
- Transformer
- 코딩테스트
- BFS
- Algorithm
- 분리집합
링크