[๋ฐฑ์ค 1890 ๐ฅ] ์ ํ
https://www.acmicpc.net/problem/1890
1890๋ฒ: ์ ํ
์ฒซ์งธ ์ค์ ๊ฒ์ ํ์ ํฌ๊ธฐ N (4 ≤ N ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ N๊ฐ ์ค์๋ ๊ฐ ์นธ์ ์ ํ์ ธ ์๋ ์๊ฐ N๊ฐ์ฉ ์ฃผ์ด์ง๋ค. ์นธ์ ์ ํ์๋ ์๋ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 9๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ฉฐ, ๊ฐ์ฅ
www.acmicpc.net
๋ฌธ์
N×N ๊ฒ์ํ์ ์๊ฐ ์ ํ์ ธ ์๋ค. ์ด ๊ฒ์์ ๋ชฉํ๋ ๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์ผ๋ก ๊ท์น์ ๋ง๊ฒ ์ ํ๋ฅผ ํด์ ๊ฐ๋ ๊ฒ์ด๋ค.
๊ฐ ์นธ์ ์ ํ์๋ ์๋ ํ์ฌ ์นธ์์ ๊ฐ ์ ์๋ ๊ฑฐ๋ฆฌ๋ฅผ ์๋ฏธํ๋ค. ๋ฐ๋์ ์ค๋ฅธ์ชฝ์ด๋ ์๋์ชฝ์ผ๋ก๋ง ์ด๋ํด์ผ ํ๋ค. 0์ ๋ ์ด์ ์งํ์ ๋ง๋ ์ข ์ฐฉ์ ์ด๋ฉฐ, ํญ์ ํ์ฌ ์นธ์ ์ ํ์๋ ์๋งํผ ์ค๋ฅธ์ชฝ์ด๋ ์๋๋ก ๊ฐ์ผ ํ๋ค. ํ ๋ฒ ์ ํ๋ฅผ ํ ๋, ๋ฐฉํฅ์ ๋ฐ๊พธ๋ฉด ์ ๋๋ค. ์ฆ, ํ ์นธ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ ํ๋ฅผ ํ๊ฑฐ๋, ์๋๋ก ์ ํ๋ฅผ ํ๋ ๋ ๊ฒฝ์ฐ๋ง ์กด์ฌํ๋ค.
๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์ผ๋ก ๊ท์น์ ๋ง๊ฒ ์ด๋ํ ์ ์๋ ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ๊ฒ์ ํ์ ํฌ๊ธฐ N (4 ≤ N ≤ 100)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ N๊ฐ ์ค์๋ ๊ฐ ์นธ์ ์ ํ์ ธ ์๋ ์๊ฐ N๊ฐ์ฉ ์ฃผ์ด์ง๋ค. ์นธ์ ์ ํ์๋ ์๋ 0๋ณด๋ค ํฌ๊ฑฐ๋ ๊ฐ๊ณ , 9๋ณด๋ค ์๊ฑฐ๋ ๊ฐ์ ์ ์์ด๋ฉฐ, ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์๋ ํญ์ 0์ด ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
๊ฐ์ฅ ์ผ์ชฝ ์ ์นธ์์ ๊ฐ์ฅ ์ค๋ฅธ์ชฝ ์๋ ์นธ์ผ๋ก ๋ฌธ์ ์ ๊ท์น์ ๋ง๊ฒ ๊ฐ ์ ์๋ ๊ฒฝ๋ก์ ๊ฐ์๋ฅผ ์ถ๋ ฅํ๋ค. ๊ฒฝ๋ก์ ๊ฐ์๋ 2^63-1๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.

๋ฌธ์ ํ์ด
- ๋งจ ์๋จ ์ผ์ชฝ๋ถํฐ ํ๋จ ์ค๋ฅธ์ชฝ๊น์ง ์ด๋ํ๊ธฐ ๋๋ฌธ์, for๋ฌธ ํ์์ ํตํด [0][0] ์์น์์ ์์ํด์ [n-1][n-1]์ ๋๋ฌํด์ ์ ํ๊ฐ ์ข ๋ฃ๋ ๋๊น์ง ํ์ํ๋ค.
- ์ฌ๊ธฐ์, DP๋ฅผ ์ฌ์ฉํด์ ๊ฐ ์์น๊น์ง ์ฌ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ์ฅํด์คฌ๋ค.
- dp[i][j] : ์์์ ์์ ์ถ๋ฐํด์ [i][j]๊น์ง ์ฌ ์ ์๋ ๊ฒฝ์ฐ์ ์
- for๋ฌธ ํ์์ ํตํด์ ํ์ฌ ์์น๊ฐ dp ๊ฐ์ด ์๋๋ผ๋ฉด ํด๋น ์์น์ ๊ฐ๋ ๊ฒฝ๋ก๊ฐ ์กด์ฌํ๋ ๊ฒ์ด๋ฏ๋ก, ์๋๋ step[i][j] ๋งํผ ๊ฐ๋ ๊ฒฝ์ฐ๋ ์ค๋ฅธ์ชฝ์ผ๋ก step[i][j]๊น์ง ๊ฐ๋ ๊ฒฝ์ฐ๊ฐ ๋ฒ์ ์์ ๊ฐ์ด๋ผ๋ฉด ์ด๋ํ ์์น์ ํ์ฌ ์์น์ dp ๊ฐ์ ์ถ๊ฐํด์ ์ด๋ํ ์์น์ ๋๋ฌํ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ฐฑ์ ํ๋ค.
- ์ด๋ฌํ ๊ณผ์ ์ ๊ฑฐ์ณ์ ๋ง์ง๋ง์ ๋๋ฌํ๋ฉด for๋ฌธ์ ์ข ๋ฃํ๊ณ ๋์ค๊ฒ ๋๋๋ฐ, ์ฌ๊ธฐ์ ์ฃผ์ํ ์ ์ step[i][j]๊ฐ 0์ธ ๊ฒฝ์ฐ์ ํ์ฌ y ์์น+0, ํ์ฌ x ์์น +0์ผ๋ก ๋ฒ์ ์์ ํด๋นํ๋ ๊ฒ์ผ๋ก ํ๋จํด์ step[i][j](์ฆ, ์ข ์ )์์ ์๊ธฐ ์์ ์ ๋ ํด์ฃผ์ง ์๋๋ก step[i][j]๊ฐ 0์ด ์๋ ๊ฒฝ์ฐ์๋ง ์ฐ์ฐ์ ์ํํ๋๋ก ์กฐ๊ฑด์ ๊ฑธ์ด์ค์ผ ์ฌ๋ฐ๋ฅธ ๊ฐ์ ์ถ๋ ฅํ ์ ์๋ค.
import sys
n=int(sys.stdin.readline())
step=[list(map(int, sys.stdin.readline().split(' '))) for _ in range(n)]
# ๊ฐ ์์น๊น์ง ์ฌ ์ ์๋ ๊ฒฝ์ฐ์ ์
dp=[[0]*(n) for _ in range(n)]
dp[0][0]=1
for i in range(n):
for j in range(n):
# 0์ด ์๋ ๊ฒฝ์ฐ, ์ฆ ๋ฐฉ๋ฌธ ๊ฐ๋ฅํ ์นธ์ธ ๊ฒฝ์ฐ
# step์ด 0์ธ ๊ฒฝ์ฐ์ i+step[i][j], j+step[i][j] ๋ชจ๋ ๊ทธ ์๋ฆฌ ๊ทธ๋๋ก์ธ ๊ฒ์ผ๋ก ๊ณ์ฐ๋์ด์ ํ์ฌ ์์น์ dp๊ฐ์ ๋ํด์ฃผ๊ธฐ ๋๋ฌธ์ ๊ณ์ฐํด์ ์๋๋ค
if dp[i][j]!=0 and step[i][j]!=0:
# ํ์ฌ ์นธ์ ํด๋นํ๋ ์ ์๋งํผ ์ ํํด์ dp ๊ฐ ๊ฐฑ์
if i+step[i][j]<n:
dp[i+step[i][j]][j]+=dp[i][j]
if j+step[i][j]<n:
dp[i][j+step[i][j]]+=dp[i][j]
print(dp[n-1][n-1])
https://www.acmicpc.net/board/view/119014
๊ธ ์ฝ๊ธฐ - BFS๋ก ํด๋น ๋ฌธ์ ๋ฅผ ํ ์ ์๋ ์ด์ (์ฃผ๊ด์ ์ธ ์๊ฐ)
๋๊ธ์ ์์ฑํ๋ ค๋ฉด ๋ก๊ทธ์ธํด์ผ ํฉ๋๋ค.
www.acmicpc.net
<์ด ๋ฌธ์ ๋ฅผ BFS๋ก ํ ์ ์๋ ์ด์ >