Algorithm

[๋ฐฑ์ค€] 2178. ๋ฏธ๋กœ ํƒ์ƒ‰ python

๐Ÿณ ๋งํฌ

๋ฐฑ์ค€ 2178๋ฒˆ ๋ฏธ๋กœํƒ์ƒ‰

๐Ÿ• ๋ฌธ์ œ

Nร—Mํฌ๊ธฐ์˜ ๋ฐฐ์—ด๋กœ ํ‘œํ˜„๋˜๋Š” ๋ฏธ๋กœ๊ฐ€ ์žˆ๋‹ค.

1 0 1 1 1 1
1 0 1 0 1 0
1 0 1 0 1 1
1 1 1 0 1 1

๋ฏธ๋กœ์—์„œ 1์€ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ์นธ์„ ๋‚˜ํƒ€๋‚ด๊ณ , 0์€ ์ด๋™ํ•  ์ˆ˜ ์—†๋Š” ์นธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๋Ÿฌํ•œ ๋ฏธ๋กœ๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, (1, 1)์—์„œ ์ถœ๋ฐœํ•˜์—ฌ (N, M)์˜ ์œ„์น˜๋กœ ์ด๋™ํ•  ๋•Œ ์ง€๋‚˜์•ผ ํ•˜๋Š” ์ตœ์†Œ์˜ ์นธ ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜์‹œ์˜ค. ํ•œ ์นธ์—์„œ ๋‹ค๋ฅธ ์นธ์œผ๋กœ ์ด๋™ํ•  ๋•Œ, ์„œ๋กœ ์ธ์ ‘ํ•œ ์นธ์œผ๋กœ๋งŒ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค.

์œ„์˜ ์˜ˆ์—์„œ๋Š” 15์นธ์„ ์ง€๋‚˜์•ผ (N, M)์˜ ์œ„์น˜๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋‹ค. ์นธ์„ ์…€ ๋•Œ์—๋Š” ์‹œ์ž‘ ์œ„์น˜์™€ ๋„์ฐฉ ์œ„์น˜๋„ ํฌํ•จํ•œ๋‹ค.

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

  1. n,m๊ณผ miro๋ฅผ ์ฐจ๋ก€๋Œ€๋กœ ๋ฐ›์•„์ค€๋‹ค.
    • ์ด๋•Œ, miro์— ๋“ค์–ด์˜ค๋Š” ๊ฐ’๋“ค์€ ์ˆซ์ž๊ฐ€ ๋ถ™์–ด์„œ ๋“ค์–ด์˜ค๋ฏ€๋กœ str์œผ๋กœ ๋ฐ›์€ ์ฑ„ listํ™” ํ•˜์—ฌ ์ด์šฉํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜๋‹ค.
  2. (0,0)๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜์—ฌ ์ด์›ƒ ๋…ธ๋“œ๋“ค์„ ๋ฐฉ๋ฌธํ•œ๋‹ค.
  3. ๋ฐฉ๋ฌธํ•  ๋•Œ, visit ๋ฐฐ์—ด์˜ ๊ฐ’์— ์ด์ „ visit ๋ฐฐ์—ด์— ์ €์žฅ๋œ ๊ฐ’ + 1์„ ํ•ด์ค€๋‹ค.
  • ์ด์œ ๋Š”, ์‹œ๊ฐ„ ์ดˆ๊ณผ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด์„œ์ด๋‹ค. ๋‹ค์‹œ ์ œ์ผ ์ฒ˜์Œ์œผ๋กœ ๋Œ์•„๊ฐ€๋Š” ๊ฒƒ์ด ์•„๋‹Œ ์ด์ „ ๊ฐ’์— +1์„ ํ•จ์œผ๋กœ์จ ์ตœ์ข… (n-1,m-1)์— ๋„๋‹ฌํ•˜์˜€์„ ๋•Œ ์ตœ์†Ÿ๊ฐ’์„ visit ๋ฐฐ์—ด์— ์ €์žฅํ•  ์ˆ˜ ์žˆ๋‹ค.

solution ์ฝ”๋“œ

  1. bfs๋กœ solveํ•œ ์ฝ”๋“œ
    import sys
    sys.setrecursionlimit(10**8)
    sys.stdin = open("input.txt","rt")
    

dx = [1,-1,0,0]
dy = [0,0,1,-1]

n,m = [int(x) for x in sys.stdin.readline().split()]
answer = n*m + 1
visit = [[0] * m for _ in range(n)]
visit[0][0] = 1
miro = [list(sys.stdin.readline().strip()) for _ in range(n)]

q = []
q.append((0,0))
while q:
x, y = q.pop(0)
if x == n-1 and y == m-1:
print(visit[x][y])
sys.exit()
for i in range(4):
nx = x + dx[i]
ny = y + dy[i]
if 0 <= nx < n and 0 <= ny < m:
if visit[nx][ny] == 0 and miro[nx][ny] == '1':
visit[nx][ny] = visit[x][y] + 1
q.append((nx,ny))


2. dfs๋กœ ์‹œ๊ฐ„์ดˆ๊ณผ ์ฝ”๋“œ
bfs๋กœ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ํ’€์–ด๋ณด๋ฉฐ ๋“  ์ƒ๊ฐ์ด, (n,m)๊นŒ์ง€์˜ ์ตœ๋‹จ ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ•˜๋Š” ๋ฌธ์ œ์ด๋ฏ€๋กœ dfs์ฒ˜๋Ÿผ ์ฒ˜์Œ๋ถ€ํ„ฐ (n,m)๊นŒ์ง€ ๋„๋‹ฌํ•œ ๋’ค ๋’ค๋กœ ๋น ์ ธ๋‚˜์˜ค๋ฉฐ ๋‹ค๋ฅธ ๊ฒฝ๋กœ๋ฅผ ํƒ์ƒ‰ํ•˜๋Š” ๋ฐฉ๋ฒ•๋ณด๋‹ค๋Š” bfs์ฒ˜๋Ÿผ ์ด์›ƒ ๋…ธ๋“œ๋“ค์„ ๋ชจ๋‘ ํƒ์ƒ‰ํ•˜์—ฌ visit์— ๊ฒฝ๋กœ ๊ฐ’์„ ๋ˆ„์ ํ•œ ๋’ค, ์ตœ์ข… ๋„๋‹ฌํ–ˆ์„ ๋•Œ visit[n-1][m-1]์˜ ๊ฐ’์„ ์ถœ๋ ฅํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฅด๊ณ , ์ •ํ™•ํ•œ ๋ฐฉ๋ฒ•์ด๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ๋‹ค. 

```python3
import sys
sys.setrecursionlimit(10**8)
sys.stdin = open("input.txt","rt")

dx = [1,-1,0,0]
dy = [0,0,1,-1]

def dfs(x,y, cnt):
    global answer
    if x == n-1 and y == m-1:
        answer = cnt if answer > cnt else answer
    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 and miro[nx][ny] == '1':
                visit[nx][ny] = 1
                dfs(nx,ny,cnt+1)
                visit[nx][ny] = 0



n,m = [int(x) for x in sys.stdin.readline().split()]
answer = n*m + 1
visit = [[0] * m for _ in range(n)]
visit[0][0] = 1
miro = [list(sys.stdin.readline().strip()) for _ in range(n)]

# miro = [sys.stdin.readline().rstrip() for _ in range(n)]

dfs(0,0,1)
print(answer)