ํฐ์คํ ๋ฆฌ ๋ทฐ
728x90
๋ฐ์ํ
๋ฌธ์
๋ฌธ์ ํ์ด
NxN ๊ฒฉ์ํ์์ ํ์ดํ๋ฅผ ํ์ชฝ ๋ (N, N)์ผ๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ ๋ฌธ์ ์ด๋ค. ํ์ดํ๋ ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ์ผ๋ก ์์ง์ผ ์ ์์ผ๋ฉฐ ์์ง์ด๋ ๊ฐ๋๋ 45๋์ด๋ค. ์ฆ ๊ฐ๋ก์์ ์ธ๋ก, ์ธ๋ก์์ ๊ฐ๋ก๋ ์ฆ์ ๋ณํํ ์ ์๋ค. ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํด ์๋์ ๊ฐ์ด `DFS`๋ก ํ์๋ค.
from sys import stdin
def visitable(x, y, direction):
if direction == DIAGONAL:
return x < n and y < n and \
graph[x - 1][y] == 0 and graph[x][y - 1] == 0 and graph[x][y] == 0
return x < n and y < n and graph[x][y] == 0
def dfs(loc, direction):
global answer
if loc == [n - 1, n - 1]:
answer += 1
for next_dir, delta in enumerate(dirs):
# 45๋๋ง ํ์ ์ํฌ ์ ์๊ธฐ์, ๊ฐ๋ก - ์ธ๋ก, ์ธ๋ก - ๊ฐ๋ก๋ ๋ฐ๋ก ์ ํ ๋ถ๊ฐ.
if (direction == SERO and next_dir == GARO) or \
(direction == GARO and next_dir == SERO):
continue
next_x, next_y = loc[X] + delta[X], loc[Y] + delta[Y]
if visitable(next_x, next_y, next_dir):
dfs([next_x, next_y], next_dir)
if __name__ == '__main__':
X, Y = 0, 1
GARO, SERO, DIAGONAL = 0, 1, 2
answer = 0
dirs = [(0, 1), (1, 0), (1, 1)]
n = int(stdin.readline())
graph = [list(map(int, stdin.readline().split())) for _ in range(n)]
dfs([0, 1], 0)
print(answer)
์์ 1, 2, 3, 4๋ ์ ๋ต์ ์ ์ถ๋ ฅํ๋๋ฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํ๋ ์ฝ๋์ด๋ค. ํ์ดํ ์ฎ๊ธฐ๊ธฐ 2 ๋ฌธ์ ๋ฅผ ๋ณด๋, N์ ๋ฒ์๊ฐ ์ฆ๊ฐํ์ฌ `DP`๋ก ์ ๊ทผํ์ฌ์ผ ๊ฒ ๋ค๊ณ ์๊ฐํ๋ค.
`DP`๋ก ํ๊ธฐ ์ํด์๋ (N, N)์ ๋์ฐฉํ๋ ๊ฒฝ์ฐ๋ฅผ ๋ฉ๋ชจ์ด์ ์ด์ ํจ์ผ๋ก์จ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
- DP ๋ฐฐ์ด์ `[X][Y][Direction]`์ผ๋ก ๊ตฌ์ฑํ์ฌ, ์ขํ์ ๋ฐ๋ผ ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ฐฉ๋ฒ์ ๊ตฌํ๋ค.
- ๋๊ฐ์ ์ผ๋ก ์ด๋ํ๊ธฐ ์ํด์๋ ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ์ ๋ฒฝ์ด ์์ด์ผ ํ๋ค.
- ์ธ๋ก, ๊ฐ๋ก๋ก ์ด๋ํ๊ธฐ ์ํด์๋ ์ด๋ํ๋ ๋ฐฉํฅ์ ๋ฒฝ์ด ์์ด์ผ ํ๋ค.
- ๊ฐ ๋ฐฉํฅ์ ์ ํ์์ ๋ค์๊ณผ ๊ฐ๋ค.
- ๊ฐ๋ก : `dp[x][y - 1][๊ฐ๋ก] + dp[x][y - 1][๋๊ฐ์ ]`
- ์ธ๋ก : `dp[x - 1][y][์ธ๋ก] + dp[x - 1][y][๋๊ฐ์ ]`
- ๋๊ฐ์ : `dp[x - 1][y - 1][๊ฐ๋ก] + dp[x - 1][y - 1][์ธ๋ก] + dp[x - 1][y - 1][๋๊ฐ์ ]`
- ์ฆ ๊ฐ๋ก, ์ธ๋ก๋ ์ด์ ์ขํ์ ์์ ์ ๋ฐฉํฅ + ๋๊ฐ์ ์์ ๊ฒฝ๋ก๊ฐ ์งํ๋ ์ ์๊ณ , ๋๊ฐ์ ์ ๊ฒฝ์ฐ ๋ชจ๋ ๊ฒฝ์ฐ์์ ๊ฒฝ๋ก๊ฐ ์งํ๋ ์ ์๋ค.
- 45๋๋ก ์์ง์ผ ์ ์๋ค๋ ๋ฌธ์ ์ ์ ํ์กฐ๊ฑด ๋๋ฌธ์ด๋ค.
- ์ด์ ๊ฐ์ ๋ก์ง์ ๋ฐ๋ณตํ๋ฉด, DP๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ค.
์ฝ๋
from sys import stdin
if __name__ == '__main__':
GARO, SERO, DIAGONAL = 0, 1, 2
n = int(stdin.readline())
graph = [list(map(int, stdin.readline().split())) for _ in range(n)]
# [x][y][direction]
dp = [[[0] * 3 for _ in range(n)] for _ in range(n)]
# ์์ ์์น 1๋ก ์ด๊ธฐํ
dp[0][1][GARO] = 1
for y in range(2, n):
if graph[0][y] == 0:
dp[0][y][GARO] = dp[0][y - 1][GARO]
for x in range(n):
for y in range(2, n):
# ๋๊ฐ์ ์ผ๋ก ์ด๋ํ๊ธฐ ์ํด์๋ ๊ฐ๋ก, ์ธ๋ก, ๋๊ฐ์ ์ด ๋ฒฝ์ด ์๋์ด์ผ ํจ.
if graph[x][y] == graph[x][y - 1] == graph[x - 1][y] == 0:
dp[x][y][DIAGONAL] = \
dp[x - 1][y - 1][GARO] + dp[x - 1][y - 1][SERO] + dp[x - 1][y - 1][DIAGONAL]
if graph[x][y] == 0:
dp[x][y][GARO] = dp[x][y - 1][GARO] + dp[x][y - 1][DIAGONAL]
dp[x][y][SERO] = dp[x - 1][y][SERO] + dp[x - 1][y][DIAGONAL]
print(sum(dp[-1][-1]))
728x90
๋ฐ์ํ
'๐จโ๐ป ์ฝ๋ฉํ ์คํธ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
๋ฐฑ์ค: 2579 ๊ณ๋จ ์ค๋ฅด๊ธฐ (0) | 2020.10.06 |
---|---|
๋ฐฑ์ค: 16637 ๊ดํธ ์ถ๊ฐํ๊ธฐ (4) | 2020.10.06 |
๋ฐฑ์ค: 1655 ๊ฐ์ด๋ฐ๋ฅผ ๋งํด์ (0) | 2020.10.04 |
๋ฐฑ์ค: 2606 ๋ฐ์ด๋ฌ์ค (0) | 2020.10.04 |
๋ฐฑ์ค: 16956 ๋๋์ ์ (0) | 2020.10.04 |
๋๊ธ
๊ธ ๋ณด๊ดํจ
์ต๊ทผ์ ์ฌ๋ผ์จ ๊ธ
์ต๊ทผ์ ๋ฌ๋ฆฐ ๋๊ธ