[BOJ][๐ก5][๋ฐฑ์ค#17070] ํ์ดํ ์ฎ๊ธฐ๊ธฐ 1
์์ฑ:    
์ ๋ฐ์ดํธ:
์นดํ ๊ณ ๋ฆฌ: BOJ Gold V
๋ฌธ์ ์ถ์ฒ
๋ฌธ์
์ ํ์ด๊ฐ ์ ์ง์ผ๋ก ์ด์ฌํ๋ค. ์ ์ง์ ํฌ๊ธฐ๋ NรN์ ๊ฒฉ์ํ์ผ๋ก ๋ํ๋ผ ์ ์๊ณ , 1ร1ํฌ๊ธฐ์ ์ ์ฌ๊ฐํ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ๊ฐ์ ์นธ์ (r, c)๋ก ๋ํ๋ผ ์ ์๋ค. ์ฌ๊ธฐ์ r์ ํ์ ๋ฒํธ, c๋ ์ด์ ๋ฒํธ์ด๊ณ , ํ๊ณผ ์ด์ ๋ฒํธ๋ 1๋ถํฐ ์์ํ๋ค. ๊ฐ๊ฐ์ ์นธ์ ๋น ์นธ์ด๊ฑฐ๋ ๋ฒฝ์ด๋ค. ์ค๋์ ์ง ์๋ฆฌ๋ฅผ ์ํด์ ํ์ดํ ํ๋๋ฅผ ์ฎ๊ธฐ๋ ค๊ณ ํ๋ค. ํ์ดํ๋ ์๋์ ๊ฐ์ ํํ์ด๊ณ , 2๊ฐ์ ์ฐ์๋ ์นธ์ ์ฐจ์งํ๋ ํฌ๊ธฐ์ด๋ค.
ํ์ดํ๋ ํ์ ์ํฌ ์ ์์ผ๋ฉฐ, ์๋์ ๊ฐ์ด 3๊ฐ์ง ๋ฐฉํฅ์ด ๊ฐ๋ฅํ๋ค.
ํ์ดํ๋ ๋งค์ฐ ๋ฌด๊ฒ๊ธฐ ๋๋ฌธ์, ์ ํ์ด๋ ํ์ดํ๋ฅผ ๋ฐ์ด์ ์ด๋์ํค๋ ค๊ณ ํ๋ค. ๋ฒฝ์๋ ์๋ก์ด ๋ฒฝ์ง๋ฅผ ๋ฐ๋๊ธฐ ๋๋ฌธ์, ํ์ดํ๊ฐ ๋ฒฝ์ ๊ธ์ผ๋ฉด ์ ๋๋ค. ์ฆ, ํ์ดํ๋ ํญ์ ๋น ์นธ๋ง ์ฐจ์งํด์ผ ํ๋ค. ํ์ดํ๋ฅผ ๋ฐ ์ ์๋ ๋ฐฉํฅ์ ์ด 3๊ฐ์ง๊ฐ ์์ผ๋ฉฐ,ย โ,ย โ,ย โ ๋ฐฉํฅ์ด๋ค. ํ์ดํ๋ ๋ฐ๋ฉด์ ํ์ ์ํฌ ์ ์๋ค. ํ์ ์ 45๋๋ง ํ์ ์ํฌ ์ ์์ผ๋ฉฐ, ๋ฏธ๋ ๋ฐฉํฅ์ ์ค๋ฅธ์ชฝ, ์๋, ๋๋ ์ค๋ฅธ์ชฝ ์๋ ๋๊ฐ์ ๋ฐฉํฅ์ด์ด์ผ ํ๋ค. ํ์ดํ๊ฐ ๊ฐ๋ก๋ก ๋์ฌ์ง ๊ฒฝ์ฐ์ย ๊ฐ๋ฅํ ์ด๋ ๋ฐฉ๋ฒ์ ์ด 2๊ฐ์ง, ์ธ๋ก๋ก ๋์ฌ์ง ๊ฒฝ์ฐ์๋ 2๊ฐ์ง, ๋๊ฐ์ ๋ฐฉํฅ์ผ๋ก ๋์ฌ์ง ๊ฒฝ์ฐ์๋ 3๊ฐ์ง๊ฐ ์๋ค. ์๋ ๊ทธ๋ฆผ์ ํ์ดํ๊ฐ ๋์ฌ์ง ๋ฐฉํฅ์ ๋ฐ๋ผ์ ์ด๋ํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ชจ๋ ๋ํ๋ธ ๊ฒ์ด๊ณ , ๊ผญ ๋น ์นธ์ด์ด์ผ ํ๋ ๊ณณ์ ์์ผ๋ก ํ์๋์ด์ ธ ์๋ค.
๊ฐ๋ก
์ธ๋ก
๋๊ฐ์ ๊ฐ์ฅ ์ฒ์์ ํ์ดํ๋ย (1, 1)์ (1, 2)๋ฅผ ์ฐจ์งํ๊ณ ์๊ณ , ๋ฐฉํฅ์ ๊ฐ๋ก์ด๋ค. ํ์ดํ์ ํ์ชฝ ๋์ (N, N)๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ์ ๊ฐ์๋ฅผ ๊ตฌํด๋ณด์.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ์ง์ ํฌ๊ธฐ N(3 โค N โค 16)์ด ์ฃผ์ด์ง๋ค. ๋์งธ ์ค๋ถํฐ N๊ฐ์ ์ค์๋ ์ง์ ์ํ๊ฐ ์ฃผ์ด์ง๋ค. ๋น ์นธ์ 0, ๋ฒฝ์ 1๋ก ์ฃผ์ด์ง๋ค. (1, 1)๊ณผ (1, 2)๋ ํญ์ ๋น ์นธ์ด๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ์ดํ์ ํ์ชฝ ๋์ (N, N)์ผ๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋์ํฌ ์ ์๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค. ๋ฐฉ๋ฒ์ ์๋ ํญ์ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
์์
์์ 1
์ ๋ ฅ
3
0 0 0
0 0 0
0 0 0
์ถ๋ ฅ
1
์์ 2
์ ๋ ฅ
4
0 0 0 0
0 0 0 0
0 0 0 0
0 0 0 0
์ถ๋ ฅ
3
์์ 3
์ ๋ ฅ
5
0 0 1 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
์ถ๋ ฅ
0
์์ 4
์ ๋ ฅ
6
0 0 0 0 0 0
0 1 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
0 0 0 0 0 0
์ถ๋ ฅ
13
My Sol
import sys
input = sys.stdin.readline
def dfs(i, j, d, N):
if i==ti and j==tj:
global ans
ans += 1
return
global mat
# ํ์ฌ ๋ฐฉํฅ์ด ๋๊ฐ์
if d=='di':
# ๋๊ฐ์ผ๋ก ๊ฐ์
if 0<=i+1<N and 0<=j+1<N:
if not (mat[i+1][j] or mat[i][j+1] or mat[i+1][j+1]):
dfs(i+1, j+1, 'di', N)
# ๊ฐ๋ก๋ก ๊ฐ์
if 0<=j+1<N:
if not mat[i][j+1]:
dfs(i, j+1, 'hr', N)
# ์ธ๋ก๋ก ๊ฐ์
if 0<=i+1<N:
if not mat[i+1][j]:
dfs(i+1, j, 've', N)
# ํ์ฌ ๋ฐฉํฅ์ด ๊ฐ๋ก
elif d=='hr':
# ๋๊ฐ์ผ๋ก ๊ฐ์
if 0<=i+1<N and 0<=j+1<N:
if not (mat[i+1][j] or mat[i][j+1] or mat[i+1][j+1]):
dfs(i+1, j+1, 'di', N)
# ๊ฐ๋ก๋ก ๊ฐ์
if 0<=j+1<N:
if not mat[i][j+1]:
dfs(i, j+1, 'hr', N)
# ํ์ฌ ๋ฐฉํฅ์ด ์ธ๋ก
elif d == 've':
# ๋๊ฐ์ผ๋ก ๊ฐ์
if 0 <= i + 1 < N and 0 <= j + 1 < N:
if not (mat[i + 1][j] or mat[i][j + 1] or mat[i + 1][j + 1]):
dfs(i + 1, j + 1, 'di', N)
# ์ธ๋ก๋ก ๊ฐ์
if 0 <= i + 1 < N:
if not mat[i + 1][j]:
dfs(i + 1, j, 've', N)
N = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]
ni, nj, nd = 0, 1, 'hr'
ti, tj = N-1, N-1
ans = 0
dfs(ni, nj, nd, N)
print(ans)
์ฌ์ค ์ด์ ์๋ ํจ์๋ฅผ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ์ฌ ์ค๋ณต์ ์ค์ฌ๋ณธ ์ฝ๋๊ฐ ์๊ฐ ์ด๊ณผ๊ฐ ๋ฐ์ํด์, ๊ทธ๋ฅ ์ค๋ณต์ ๊ณ ๋ คํ์ง ์๊ณ ์ง๊ด์ ์ผ๋ก ์ง๋ณธ ์ฝ๋๊ฐ ๋ฐ๋ก ํต๊ณผํ ์ํฉ์ด๋ค. ์ด์ ์ฝ๋๋ ํ์์ ์ถ๊ฐํ๊ฒ ๋ค. ์ด ์ฝ๋๋ ์ด๋ ค์ธ ๊ฒ๋ ์๋ค. ๊ฒฝ๊ณ ์กฐ๊ฑด๊ณผ 0์ด์ด์ผ ํ๋ ๊ณต๊ฐ์ด 0์ด๋ฉด ํจ์๋ฅผ ๋ค์ ํธ์ถํ๊ณ , ์ด๋ ๊ฒ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด ์ ์งํ๋ค๊ฐ ni, nj๊ฐ ti, tj ์ฆ ๋ฌธ์ ์ (N, N) ์์น์ ๋๋ฌํ๋ฉด ์ ์ญ ๋ณ์์ธ ans์ 1์ ๋ํ๊ณ ๋๋์๊ฐ๋ ๋ฐฉ์์ด๋ค.
๊ฒฐ๊ณผ
๋ง์์ต๋๋ค!!
์ด์ ์ฝ๋
import sys
input = sys.stdin.readline
def dfs(i, j, d):
if i==ti and j==tj:
global ans
ans += 1
return
global N
mdict = {
've': (1, 0),
'hr': (0, 1),
'di': (1, 1)
}
for dd in ['hr', 've', 'di']:
if search(i, j, d, dd):
di, dj = mdict[dd]
dfs(i+di, j+dj, dd)
def search(ni, nj, nd, dd):
global mat
if nd == 'hr' and dd == 've':
return 0
elif nd == 've' and dd == 'hr':
return 0
if dd == 'di':
if 0<=ni+1<N and 0<=nj+1<N:
return not (mat[ni][nj+1] or mat[ni+1][nj] or mat[ni+1][nj+1])
return 0
elif dd == 'hr':
if 0<=nj+1<N:
return not mat[ni][nj+1]
return 0
elif dd == 've':
if 0<=ni+1<N:
return not mat[ni+1][nj]
return 0
N = int(input())
mat = [list(map(int, input().split())) for _ in range(N)]
ni, nj, nd = 0, 1, 'hr'
ti, tj = N-1, N-1
ans = 0
dfs(ni, nj, nd)
print(ans)
์ด์ ๋ณด๋๊น ํฌ๊ฒ ๋ค๋ฅธ ๊ฒ ๊ฐ์ง๋ ์๋ค. ๋ค๋ง ๊ฐ๋ก ์ธ๋ก ๋๊ฐ์ ์ ๋ํ ์์ง์ ๊ฐ๋ฅ ์ฌ๋ถ๋ฅผ search() ํจ์๋ฅผ ํตํด ์ธ๋ถ์์ ํ์ธํ๊ณ ์ ํ์๊ณ , ํ์ฌ ๋ฐฉํฅ๊ณผ ํฌ๋ง ๋ฐฉํฅ์ ๋ํ ์กฐ๊ฑด์ ์ฌ๋ฌ ๊ฐ ๋ ๋์ด return์ ์กฐ์ ํ์๋ค. ๊ทธ๋์ ์กฐ๊ฑด์ ๋ ์กฐํํ๊ณ , ํจ์๋ฅผ ํธ์ถํ๋ ์๊ฐ์ด ๋ ๋ค๊ฒ ๋ ๊ฒ ๊ฐ๋ค. ๋ถ๋ฆฌ๋ฅผ ํ์ ๋ฟ ๊ทธ๋ฆฌ ํจ์จ์ ์ด์ง๋ ์์๋ค.
๋ชจ๋ฒ ๋ต์
n = int(sys.stdin.readline().strip())
arr = [list(map(int,sys.stdin.readline().split())) for _ in range(n)]
stack = [[[0]*3 for _ in range(n)] for _ in range(n)]
stack[0][1][0] = 1
for i in range(n):
for j in range(n):
if arr[i][j] == 1:
continue
if j-1 >= 0:
stack[i][j][0]+=stack[i][j-1][0]
stack[i][j][0]+=stack[i][j-1][2]
if i-1 >= 0:
stack[i][j][1]+=stack[i-1][j][1]
stack[i][j][1]+=stack[i-1][j][2]
if i-1>=0 and j-1>=0:
if arr[i-1][j] == 1 or arr[i][j-1] == 1:
continue
stack[i][j][2]+=stack[i-1][j-1][0]
stack[i][j][2]+=stack[i-1][j-1][1]
stack[i][j][2]+=stack[i-1][j-1][2]
print(sum(stack[-1][-1]))
ํน์ดํ๊ฒ ํผ ์ฝ๋๊ฐ ์์ด์ ๊ฐ์ ธ์๋ณด์๋ค. ํํ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ณ์ฐํ ๋ ์ฌ์ฉํ๋ ๋ฐฉ์์ผ๋ก ์ดํ ์ฝ๋์ ์ฃผ๋ณ์ ๊ฒฝ์ฐ์ ์๋ฅผ ๋ํด๊ฐ๋ฉฐ 3์ฐจ์ ๋ฐฐ์ด stack์ ์ด์ฉํด ์ธ๋ฑ์ค๋ฅผ ์กฐ์ ํด์ฃผ๋ฉฐ ๋์ ํด๊ฐ๋ ๊ฒ์ด๋ค. ๋ฐฉ์์ ์๊ฐํ์ง๋ง ๊ตฌํ์ ๊ฐ์ด ์ ์์ ๋ชป ํด๋ณธ ๋ฐฉ์์ธ๋ฐ ์ ๋ง ๊ตฌํ ์ค๋ ฅ์ ๊ฐํํ๊ฒ ๋๋ ์ฝ๋์ด๋ค.
๋๊ธ๋จ๊ธฐ๊ธฐ