[BOJ][๐ŸŸก5][๋ฐฑ์ค€#17070] ํŒŒ์ดํ”„ ์˜ฎ๊ธฐ๊ธฐ 1

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #17070


๋ฌธ์ œ

์œ ํ˜„์ด๊ฐ€ ์ƒˆ ์ง‘์œผ๋กœ ์ด์‚ฌํ–ˆ๋‹ค. ์ƒˆ ์ง‘์˜ ํฌ๊ธฐ๋Š” 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์„ ์ด์šฉํ•ด ์ธ๋ฑ์Šค๋ฅผ ์กฐ์ •ํ•ด์ฃผ๋ฉฐ ๋ˆ„์ ํ•ด๊ฐ€๋Š” ๊ฒƒ์ด๋‹ค. ๋ฐฉ์‹์€ ์ƒ๊ฐํ–ˆ์ง€๋งŒ ๊ตฌํ˜„์— ๊ฐ์ด ์•ˆ ์™€์„œ ๋ชป ํ•ด๋ณธ ๋ฐฉ์‹์ธ๋ฐ ์ •๋ง ๊ตฌํ˜„ ์‹ค๋ ฅ์— ๊ฐํƒ„ํ•˜๊ฒŒ ๋˜๋Š” ์ฝ”๋“œ์ด๋‹ค.

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ