๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

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

์ œ๋ด‰์•„ 2022. 6. 16. 09:19

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

 

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

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

www.acmicpc.net

ํŒŒ์ด์ฌ์ด๋ผ ์–ต๊นŒ๋‹นํ•จ. ๋‚œ์ด๋„๋Š” ๋‚ฎ์ง€๋งŒ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋กœ ๊ณ ์ƒํ–ˆ๋‹ค.

๋ฐ‘์—์„œ๋ถ€ํ„ฐ bfs(4), dfs(2), dp(1) ๋กœ ํ’€์—ˆ๋‹ค

๋งจ ์ฒ˜์Œ bfs๋กœ ํ’€์—ˆ์„๋•Œ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ์ฑ„์  70%์—์„œ ์ž๊พธ ๊ฑธ๋ฆฌ๊ธธ๋ž˜ ๋ฐฉ๋ฒ•์ด ํ‹€๋ฆฐ ์ค„ ์•Œ์•˜๋‹ค.

์•„๋งˆ ํŒŒ์ด์ฌ์ด ์•„๋‹ˆ์˜€์œผ๋ฉด ๋งž์•˜์„ ๊ฑฐ ๊ฐ™๋‹ค. 

from collections import deque
import sys

count = 0
N = int(input())
home = []
for _ in range(N):
    home.append([int(x) for x in sys.stdin.readline().rstrip().split()])

def bfs():
    global count
    deq = deque()
    deq.append([0,1,0]) # 0 ๊ฐ€๋กœ 1 ์„ธ๋กœ 2 ๋Œ€๊ฐ์„ 

    while deq:
        x, y, state = deq.popleft()
        if x == N - 1 and y == N - 1:
            count += 1
            continue

        if state == 0:
            if y == N - 1:
                continue

            if 0 <= x < N and 0 <= y + 1 < N and home[x][y + 1] == 0:
                deq.append([x, y + 1, 0])

            if 0 <= x + 1 < N and 0 <= y + 1 < N and home[x][y + 1] == 0 and home[x + 1][y] == 0 and home[x + 1][y + 1] == 0:
                deq.append([x + 1, y + 1, 2])

        elif state == 1:
            if x == N - 1:
                continue

            if 0 <= x + 1 < N and 0 <= y < N and home[x + 1][y] == 0:
                deq.append([x + 1, y, 1])

            if 0 <= x + 1 < N and 0 <= y + 1 < N and home[x][y + 1] == 0 and home[x + 1][y] == 0 and home[x + 1][y + 1] == 0:
                deq.append([x + 1, y + 1, 2])

        elif state == 2:

            if 0 <= x < N and 0 <= y + 1 < N and home[x][y + 1] == 0:
                deq.append([x, y + 1, 0])

            if 0 <= x + 1 < N and 0 <= y < N and home[x + 1][y] == 0:
                deq.append([x + 1, y, 1])

            if 0 <= x + 1 < N and 0 <= y + 1 < N and home[x][y + 1] == 0 and home[x + 1][y] == 0 and home[x + 1][y + 1] == 0:
                deq.append([x + 1, y + 1, 2])
                
bfs()
print(count)

๋ฐฉ๋ฒ•์€ ๊ฐ„๋‹จํ•˜๋‹ค. ํƒ์ƒ‰ํ•˜๋ฉด์„œ ์ขŒํ‘œ์™€ ๊ฐ™์ด ์ƒํƒœ(๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„ )๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฐ’๋„ ํ์— ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค.

๊ทผ๋ฐ ์‹œ๊ฐ„ ์ดˆ๊ณผ๋– ์„œ ์„ค๋งˆ ํ•˜๊ณ  dfs๋กœ ํ’€์–ด๋ด„.

 

import sys
count = 0
N = int(input())
home = []

for _ in range(N):
    home.append([int(x) for x in sys.stdin.readline().rstrip().split()])

def dfs(x,y,state): # state 0: ๊ฐ€๋กœ, 1: ์„ธ๋กœ , 2: ๋Œ€๊ฐ์„ 
    global count
    if x == N - 1 and y == N - 1:
        count += 1
        return

    if state == 0:
        if y == N - 1: # ์ด๋™๋ถˆ๊ฐ€
            return

        if 0 <= x < N and 0 <= y + 1 < N and home[x][y + 1] == 0:
            dfs(x, y + 1, 0)

        if 0 <= x + 1 < N and 0 <= y + 1 < N and home[x][y + 1] == 0 and home[x + 1][y] == 0 and home[x + 1][
            y + 1] == 0:
            dfs(x + 1, y + 1, 2)

    elif state == 1:
        if x == N - 1: # ์ด๋™๋ถˆ๊ฐ€
            return

        if 0 <= x + 1 < N and 0 <= y < N and home[x + 1][y] == 0:
            dfs(x + 1, y, 1)

        if 0 <= x + 1 < N and 0 <= y + 1 < N and home[x][y + 1] == 0 and home[x + 1][y] == 0 and home[x + 1][
            y + 1] == 0:
            dfs(x + 1, y + 1, 2)

    elif state == 2:
        if 0 <= x < N and 0 <= y + 1 < N and home[x][y + 1] == 0:
            dfs(x, y + 1, 0)

        if 0 <= x + 1 < N and 0 <= y < N and home[x + 1][y] == 0:
            dfs(x + 1, y, 1)

        if 0 <= x + 1 < N and 0 <= y + 1 < N and home[x][y + 1] == 0 and home[x + 1][y] == 0 and home[x + 1][
            y + 1] == 0:
            dfs(x + 1, y + 1, 2)

dfs(0,1,0)
print(count)

๋ฐฉ๋ฒ•์€ ์œ„์— bfs๋กœ ํ’€์—ˆ๋˜๊ฑฐ๋ž‘ ๋˜‘๊ฐ™๋‹ค. 

๊ทผ๋ฐ pypy๋กœ๋Š” ๋งž์ง€๋งŒ python์œผ๋กœ ์ฑ„์ ํ•˜๋‹ˆ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋–ด๋‹ค.

๊ทธ๋ƒฅ ๋„˜์–ด๊ฐ€๋ ค๋‹ค๊ฐ€ ์ฐœ์ฐœํ•ด์„œ ์ฐพ์•„๋ณด๋‹ˆ๊นŒ dp๋กœ๋„ ํ•ด๊ฒฐ๊ฐ€๋Šฅํ•ด์„œ dp๋กœ ์ตœ์ข… ํ•ด๊ฒฐํ–ˆ๋‹ค.

 

ํ’€์ด ๊ณผ์ •

๋จผ์ € ๋ฐฐ์—ด์— x, y ์ขŒํ‘œ์™€ ๊ฐ€๋กœ, ์„ธ๋กœ, ๋Œ€๊ฐ์„  ์ƒํƒœ๋ฅผ ์ €์žฅํ•˜๊ธฐ ์œ„ํ•ด 3์ฐจ์› ๋ฆฌ์ŠคํŠธ๋ฅผ ์„ ์–ธํ•œ๋‹ค.

DP[0][0][1] = 1
for i in range(2,N):
    if home[0][i] == 0:
        DP[0][0][i] = DP[0][0][i - 1]

์ดํ›„ ์ดˆ๊ธฐ๊ฐ’์„ ์„ค์ •ํ•ด์ค€๋‹ค. 1 ํ–‰์€ ๊ฐ€๋กœ ๋ฆฌ์ŠคํŠธ์—๋งŒ ์ž…๋ ฅํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

์ค‘๊ฐ„์— 1(๋ฒฝ)์ด ์žˆ์œผ๋ฉด ์ดํ›„ ๊ฐ’๋“ค์€ 0 ์ด๋ฏ€๋กœ ๋ฒฝ์„ ๋งŒ๋‚˜๊ธฐ ์ „๊นŒ์ง€ 1๋กœ ๋„ฃ์–ด์ค€๋‹ค.

 

for i in range(1,N):
    for j in range(1,N):
        if home[i][j] == 0 and home[i][j - 1] == 0 and home[i - 1][j] == 0:
            DP[2][i][j] = DP[0][i - 1][j - 1] + DP[1][i - 1][j - 1] + DP[2][i - 1][j - 1]
            # ๋Œ€๊ฐ์„  ํŒŒ์ดํ”„ ๋†“๊ธฐ

        if home[i][j] == 0:
            DP[0][i][j] = DP[0][i][j - 1] + DP[2][i][j - 1]
            # ๊ฐ€๋กœ ํŒŒ์ดํ”„ ๋†“๊ธฐ

            DP[1][i][j] = DP[1][i - 1][j] + DP[2][i - 1][j]
            # ์„ธ๋กœ ํŒŒ์ดํ”„ ๋†“๊ธฐ

์ดํ›„์—๋Š” ์กฐ๊ฑด์— ๋งž๊ฒŒ DP๋ฆฌ์ŠคํŠธ์— ๊ฐ’์„ ๋„ฃ์–ด์ฃผ๋ฉด ๋œ๋‹ค. ๋ฐฑ์ค€ ๋ฌธ์ œ ์„ค๋ช…์— ์žˆ๋Š” ๊ทธ๋ฆผ์„ ๋ณด๋ฉด ๋„์›€๋œ๋‹ค.

 

์ „์ฒด ์ฝ”๋“œ

import sys

home = []
N = int(input())
for _ in range(N):
    home.append([int(x) for x in sys.stdin.readline().rstrip().split()])

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

DP[0][0][1] = 1
for i in range(2,N):
    if home[0][i] == 0:
        DP[0][0][i] = DP[0][0][i - 1]
#print(DP)

for i in range(1,N):
    for j in range(1,N):
        if home[i][j] == 0 and home[i][j - 1] == 0 and home[i - 1][j] == 0:
            DP[2][i][j] = DP[0][i - 1][j - 1] + DP[1][i - 1][j - 1] + DP[2][i - 1][j - 1]
            # ๋Œ€๊ฐ์„  ํŒŒ์ดํ”„ ๋†“๊ธฐ

        if home[i][j] == 0:
            DP[0][i][j] = DP[0][i][j - 1] + DP[2][i][j - 1]
            # ๊ฐ€๋กœ ํŒŒ์ดํ”„ ๋†“๊ธฐ

            DP[1][i][j] = DP[1][i - 1][j] + DP[2][i - 1][j]
            # ์„ธ๋กœ ํŒŒ์ดํ”„ ๋†“๊ธฐ
print(DP[0][N - 1][N - 1] + DP[1][N - 1][N - 1] + DP[2][N - 1][N - 1])

 

์•ž์œผ๋กœ ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๊ฑธ๋ฆฌ๋ฉด bfs๋ณด๋‹จ dfs๋‚˜ dp๋ฅผ ์‚ฌ์šฉํ•ด ํ’€์–ด์•ผ๊ฒ ๋‹ค.