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

2022. 6. 16. 09:19ยท๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]

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๋ฅผ ์‚ฌ์šฉํ•ด ํ’€์–ด์•ผ๊ฒ ๋‹ค.

'๐Ÿงฉ Problem Solving > [๋ฐฑ์ค€]' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

[๋ฐฑ์ค€] 7562 ๋‚˜์ดํŠธ์˜ ์ด๋™ (python ํŒŒ์ด์ฌ)  (0) 2022.06.18
[๋ฐฑ์ค€] 11404 ํ”Œ๋กœ์ด๋“œ (python ํŒŒ์ด์ฌ)  (0) 2022.06.18
[๋ฐฑ์ค€] 10026 ์ ๋ก์ƒ‰์•ฝ(python ํŒŒ์ด์ฌ)  (0) 2022.06.15
[๋ฐฑ์ค€] 1655 ๊ฐ€์šด๋ฐ๋ฅผ๋งํ•ด์š” (python ํŒŒ์ด์ฌ)  (0) 2022.06.14
[๋ฐฑ์ค€] 7569 ํ† ๋งˆํ†  (python ํŒŒ์ด์ฌ)  (0) 2022.06.14
'๐Ÿงฉ Problem Solving/[๋ฐฑ์ค€]' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€
  • [๋ฐฑ์ค€] 7562 ๋‚˜์ดํŠธ์˜ ์ด๋™ (python ํŒŒ์ด์ฌ)
  • [๋ฐฑ์ค€] 11404 ํ”Œ๋กœ์ด๋“œ (python ํŒŒ์ด์ฌ)
  • [๋ฐฑ์ค€] 10026 ์ ๋ก์ƒ‰์•ฝ(python ํŒŒ์ด์ฌ)
  • [๋ฐฑ์ค€] 1655 ๊ฐ€์šด๋ฐ๋ฅผ๋งํ•ด์š” (python ํŒŒ์ด์ฌ)
์ œ๋ด‰์•„
์ œ๋ด‰์•„
  • ์ œ๋ด‰์•„
    Overthinking
    ์ œ๋ด‰์•„
    fake it till you make it.
  • ์ „์ฒด
    ์˜ค๋Š˜
    ์–ด์ œ
    • ๋ถ„๋ฅ˜ ์ „์ฒด๋ณด๊ธฐ (106)
      • ๐Ÿงฉ Problem Solving (83)
        • [๋ฐฑ์ค€] (74)
        • [ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค] (7)
        • [SW Expert Academy] (1)
        • [์•Œ๊ณ ๋ฆฌ์ฆ˜ for PS] (1)
      • ๐Ÿ“ฆ Data Structure (2)
      • ๐Ÿ“œ Language (14)
        • [python] (14)
      • ๐Ÿ–ค Git (1)
      • ๐ŸŒ† ์ผ์ƒ (4)
        • ๐Ÿ’ฌ ๋ฒฝ๋ณด๊ณ  ๋งํ•˜๊ธฐ (4)
      • ๐Ÿ—„๏ธ ๊ธฐํƒ€ (2)
      • ๐Ÿ”ต css (0)
  • ๋ธ”๋กœ๊ทธ ๋ฉ”๋‰ด

    • ํ™ˆ
    • ํƒœ๊ทธ
    • ๋ฐฉ๋ช…๋ก
  • ๋งํฌ

  • ๊ณต์ง€์‚ฌํ•ญ

  • ์ธ๊ธฐ ๊ธ€

  • ํƒœ๊ทธ

    ์žฌ๊ท€
    ์œ„์ƒ์ •๋ ฌ
    ์Šคํƒ
    ๋ฐฑ์ค€
    DFS
    Python
    ํŒฐ๋ฆฐ๋“œ๋กฌ
    ๋ˆ„์ ํ•ฉ
    slicing
    ๋‹ค์ต์ŠคํŠธ๋ผ
    ์ •์ฒ˜๊ธฐ
    ๋ƒ…์ƒ‰
    SWEA
    BFS
    ๊ทธ๋ฆฌ๋””
    ํ”Œ๋กœ์ด๋“œ์›Œ์…œ
    Bruteforce
    ๋ธŒ๋ฃจํŠธํฌ์Šค
    DP
    ๋ฐฑํŠธ๋ž˜ํ‚น
    ํŒŒ์ด์ฌ
    ํˆฌํฌ์ธํ„ฐ
    ๋ถ€๋ถ„ํ•ฉ
    imos
    ๋ฐ๋ธŒ์ฝ”์Šค
    boj
    ํ”„๋กœ๊ทธ๋ž˜๋จธ์Šค
    ๋ถ„ํ•  ์ •๋ณต
    ๊ตฌํ˜„
    ํ”Œ๋กœ์ด๋“œ ์™€์ƒฌ
  • ์ตœ๊ทผ ๋Œ“๊ธ€

  • ์ตœ๊ทผ ๊ธ€

  • hELLOยท Designed By์ •์ƒ์šฐ.v4.10.3
์ œ๋ด‰์•„
[๋ฐฑ์ค€] 17070 ํŒŒ์ดํ”„ ์˜ฎ๊ธฐ๊ธฐ 1 (python ํŒŒ์ด์ฌ)
์ƒ๋‹จ์œผ๋กœ

ํ‹ฐ์Šคํ† ๋ฆฌํˆด๋ฐ”