๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
โญ Problem_Solving/๋ฐฑ์ค€

[๋ฐฑ์ค€] 17070 ํŒŒ์ดํ”„ ์˜ฎ๊ธฐ๊ธฐ1 (Python/ํŒŒ์ด์ฌ)

by ํฌ์ŠคํŠธ์‰์ดํฌ 2023. 4. 4.

<๋ฌธ์ œ๋งํฌ>

https://www.acmicpc.net/problem/17070

 

17070๋ฒˆ: ํŒŒ์ดํ”„ ์˜ฎ๊ธฐ๊ธฐ 1

์œ ํ˜„์ด๊ฐ€ ์ƒˆ ์ง‘์œผ๋กœ ์ด์‚ฌํ–ˆ๋‹ค. ์ƒˆ ์ง‘์˜ ํฌ๊ธฐ๋Š” N×N์˜ ๊ฒฉ์žํŒ์œผ๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๊ณ , 1×1ํฌ๊ธฐ์˜ ์ •์‚ฌ๊ฐํ˜• ์นธ์œผ๋กœ ๋‚˜๋ˆ„์–ด์ ธ ์žˆ๋‹ค. ๊ฐ๊ฐ์˜ ์นธ์€ (r, c)๋กœ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค. ์—ฌ๊ธฐ์„œ r์€ ํ–‰์˜ ๋ฒˆํ˜ธ, c๋Š” ์—ด์˜

www.acmicpc.net

 

<ํ’€์ด ์ „๋žต>

1. 2์ฐจ์› ๋ฐฐ์—ด์—์„œ ๋„์ฐฉ์ง€๊นŒ์ง€์˜ ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ์ฐพ๋Š” ์œ ํ˜•์˜ DP ๋ฌธ์ œ์ด์ง€๋งŒ N์˜ ๋ฒ”์œ„๊ฐ€ ์ž‘์•„ BFS๋กœ๋„ ํ’€ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

2. ์ €๋Š” DP๋กœ ํ’€์—ˆ์œผ๋ฉฐ ํ…Œ์ด๋ธ”์€ ๊ฐ ์ขŒํ‘œ๋งˆ๋‹ค ํ•ด๋‹น ์ขŒํ‘œ๋ฅผ ๋์ ์œผ๋กœ ํ•˜๋Š” ํŒŒ์ดํ”„๊ฐ€ ๋†“์ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์˜ ์ˆ˜๋ฅผ ๊ฐ ๋ฐฉํ–ฅ(๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„ )์— ๋Œ€ํ•ด ๊ณ„์‚ฐํ•œ ๋ฐฐ์—ด๋กœ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

3. ํ•ด๋‹น ์ขŒํ‘œ์™€ ์ง์ „ ์ขŒํ‘œ์˜ ๋ฒฝ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๋ฉด์„œ ํ…Œ์ด๋ธ”์„ ์ฑ„์›Œ ๋‚˜๊ฐ€๋ฉด ๋ฉ๋‹ˆ๋‹ค.

 

<์ •๋‹ต ์ฝ”๋“œ>

import sys, os, io, atexit

input = lambda: sys.stdin.readline().rstrip('\r\n')
stdout = io.BytesIO()
sys.stdout.write = lambda s: stdout.write(s.encode("ascii"))
atexit.register(lambda: os.write(1, stdout.getvalue()))

# 230404 17070 ํŒŒ์ดํ”„ ์˜ฎ๊ธฐ๊ธฐ

# ์ •๋‹ต์ฝ”๋“œ

N = int(input())

arr = [list(map(int, input().split())) for _ in range(N)]

dp = [[[0, 0, 0] for _ in range(N)] for _ in range(N)] # ๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„ 

for r in range(N):
    for c in range(1, N):

        # ๋ฒฝ
        if arr[r][c] == 1:
            continue

        # ์ฒซ ํ–‰
        if r == 0:
            # ์ดˆ๊ธฐ์œ„์น˜
            if c == 1:
                dp[r][c][0] = 1
                continue

            # ๊ฐ€๋กœ
            if arr[r][c - 1] == 0:
                dp[r][c][0] += dp[r][c - 1][0] + dp[r][c - 1][2]
            #๋Œ€๊ฐ
            if arr[r - 1][c - 1] == 0 and arr[r][c - 1] == 0 and arr[r - 1][c] == 0:
                dp[r][c][2] += dp[r - 1][c - 1][0] + dp[r - 1][c - 1][1] + dp[r - 1][c - 1][2]



        if 0 <= r - 1:
            # ๊ฐ€๋กœ
            if arr[r][c - 1] == 0:
                dp[r][c][0] += dp[r][c - 1][0] + dp[r][c - 1][2]
            #์„ธ๋กœ
            if arr[r - 1][c] == 0:
                dp[r][c][1] += dp[r - 1][c][1] + dp[r - 1][c][2]
            #๋Œ€๊ฐ
            if arr[r - 1][c - 1] == 0 and arr[r][c - 1] == 0 and arr[r - 1][c] == 0:
                dp[r][c][2] += dp[r - 1][c - 1][0] + dp[r - 1][c - 1][1] + dp[r - 1][c - 1][2]



print(sum(dp[N - 1][N - 1]))

๋Œ“๊ธ€