Algorithm

[๋ฐฑ์ค€] 1520. ๋‚ด๋ฆฌ๋ง‰๊ธธ python

๐Ÿณ ๋งํฌ

๋ฐฑ์ค€ 1520๋ฒˆ ๋‚ด๋ฆฌ๋ง‰๊ธธ

๐Ÿ• ๋ฌธ์ œ

์—ฌํ–‰์„ ๋– ๋‚œ ์„ธ์ค€์ด๋Š” ์ง€๋„๋ฅผ ํ•˜๋‚˜ ๊ตฌํ•˜์˜€๋‹ค. ์ด ์ง€๋„๋Š” ์•„๋ž˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ์ง์‚ฌ๊ฐํ˜• ๋ชจ์–‘์ด๋ฉฐ ์—ฌ๋Ÿฌ ์นธ์œผ๋กœ ๋‚˜๋‰˜์–ด์ ธ ์žˆ๋‹ค. ํ•œ ์นธ์€ ํ•œ ์ง€์ ์„ ๋‚˜ํƒ€๋‚ด๋Š”๋ฐ ๊ฐ ์นธ์—๋Š” ๊ทธ ์ง€์ ์˜ ๋†’์ด๊ฐ€ ์“ฐ์—ฌ ์žˆ์œผ๋ฉฐ, ๊ฐ ์ง€์  ์‚ฌ์ด์˜ ์ด๋™์€ ์ง€๋„์—์„œ ์ƒํ•˜์ขŒ์šฐ ์ด์›ƒํ•œ ๊ณณ๋ผ๋ฆฌ๋งŒ ๊ฐ€๋Šฅํ•˜๋‹ค.

ํ˜„์žฌ ์ œ์ผ ์™ผ์ชฝ ์œ„ ์นธ์ด ๋‚˜ํƒ€๋‚ด๋Š” ์ง€์ ์— ์žˆ๋Š” ์„ธ์ค€์ด๋Š” ์ œ์ผ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์นธ์ด ๋‚˜ํƒ€๋‚ด๋Š” ์ง€์ ์œผ๋กœ ๊ฐ€๋ ค๊ณ  ํ•œ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ฐ€๋Šฅํ•œ ํž˜์„ ์ ๊ฒŒ ๋“ค์ด๊ณ  ์‹ถ์–ด ํ•ญ์ƒ ๋†’์ด๊ฐ€ ๋” ๋‚ฎ์€ ์ง€์ ์œผ๋กœ๋งŒ ์ด๋™ํ•˜์—ฌ ๋ชฉํ‘œ ์ง€์ ๊นŒ์ง€ ๊ฐ€๊ณ ์ž ํ•œ๋‹ค. ์œ„์™€ ๊ฐ™์€ ์ง€๋„์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์„ธ ๊ฐ€์ง€ ๊ฒฝ๋กœ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

์ง€๋„๊ฐ€ ์ฃผ์–ด์งˆ ๋•Œ ์ด์™€ ๊ฐ™์ด ์ œ์ผ ์™ผ์ชฝ ์œ„ ์ง€์ ์—์„œ ์ถœ๋ฐœํ•˜์—ฌ ์ œ์ผ ์˜ค๋ฅธ์ชฝ ์•„๋ž˜ ์ง€์ ๊นŒ์ง€ ํ•ญ์ƒ ๋‚ด๋ฆฌ๋ง‰๊ธธ๋กœ๋งŒ ์ด๋™ํ•˜๋Š” ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค.
๊ทธ๋ฆผ ์ถœ์ฒ˜: https://www.acmicpc.net/problem/1520

๐Ÿพ ํ’€์ด ๋ฐฉ๋ฒ•

  • ๊ฒฝ๋กœ์˜ ๊ฐœ์ˆ˜๋ฅผ ๋ˆ„์ ํ•ฉํ•˜๋Š” visit๋ผ๋Š” m*n๋ฐฐ์—ด์„ -1๋กœ ์ดˆ๊ธฐํ™”ํ•˜์—ฌ ์ƒ์„ฑํ•ด์ค€๋‹ค.
  • dfs๋ฅผ ํ†ตํ•ด ๋งˆ์ง€๋ง‰ ์ขŒํ‘œ์ธ (m-1, n-1)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ (0,0)์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ์— 1์„ ๋ฆฌํ„ดํ•œ๋‹ค.
  • dfs๋ฅผ ๋Œ๋ฆฌ๊ธฐ ์‹œ์ž‘ํ•œ ์ขŒํ‘œ์˜ visit๊ฐ’์— ํ•ด๋‹น dfs์˜ ๋ฆฌํ„ด๊ฐ’์˜ ํ•ฉ์„ ์ €์žฅํ•œ๋‹ค.

solution ์ฝ”๋“œ

  1. dfs๋กœ solveํ•œ ์ฝ”๋“œ
    import sys
    

sys.setrecursionlimit(10**7)
sys.stdin = open("input.txt")

dx = [1,-1,0,0]
dy = [0,0,1,-1]
def dfs(x,y):
if x == 0 and y == 0:
return 1
if visit[x][y] == -1:
visit[x][y] = 0
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0<=nx<n and 0<=ny<m:
if matrix[nx][ny] > matrix[x][y]:
visit[x][y] += dfs(nx,ny)
return visit[x][y]

n,m = [int(x) for x in sys.stdin.readline().split()]
matrix = list()
for _ in range(n):
matrix.append([int(x) for x in sys.stdin.readline().split()])
visit = [[-1] * m for _ in range(n)]

print(dfs(n-1,m-1))


2. dfs๋กœ ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ
dfs์™€ dp๋ฅผ ํ•จ๊ป˜ ์ด์šฉํ•ด์•ผํ•˜๊ธฐ์— dfs์™€ visit๋ฐฐ์—ด์˜ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ํ†ตํ•ด ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜๋ฉด, ์‹œ๊ฐ„ ์ดˆ๊ณผ๊ฐ€ ๋ฐœ์ƒํ•œ๋‹ค..

```python3
import sys

sys.setrecursionlimit(10**7)
sys.stdin = open("input.txt")

dx = [1,-1,0,0]
dy = [0,0,1,-1]
answer = 0
def dfs(x,y):
    global answer
    if x == 0 and y == 0:
        answer += 1
    else:
        for i in range(4):
            nx = x + dx[i]
            ny = y + dy[i]
            if 0<=nx<n and 0<=ny<m and visit[nx][ny] == 0:
                if matrix[nx][ny] > matrix[x][y]:
                    visit[nx][ny] = 1
                    dfs(nx,ny)
                    visit[nx][ny] = 0



n,m = [int(x) for x in sys.stdin.readline().split()]
matrix = list()
for _ in range(n):
    matrix.append([int(x) for x in sys.stdin.readline().split()])
visit = [[0] * m for _ in range(n)]
visit[n-1][m-1] = 1

dfs(n-1,m-1)
print(answer)