๐ ๋ฌธ์
์๊ทผ์ด๋ ๋น ๊ณต๊ฐ๊ณผ ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฑด๋ฌผ์ ๊ฐํ์๋ค. ๊ฑด๋ฌผ์ ์ผ๋ถ์๋ ๋ถ์ด ๋ฌ๊ณ , ์๊ทผ์ด๋ ์ถ๊ตฌ๋ฅผ ํฅํด ๋ฐ๊ณ ์๋ค.
๋งค ์ด๋ง๋ค, ๋ถ์ ๋์๋จ๋ถ ๋ฐฉํฅ์ผ๋ก ์ธ์ ํ ๋น ๊ณต๊ฐ์ผ๋ก ํผ์ ธ๋๊ฐ๋ค. ๋ฒฝ์๋ ๋ถ์ด ๋ถ์ง ์๋๋ค. ์๊ทผ์ด๋ ๋์๋จ๋ถ ์ธ์ ํ ์นธ์ผ๋ก ์ด๋ํ ์ ์์ผ๋ฉฐ, 1์ด๊ฐ ๊ฑธ๋ฆฐ๋ค. ์๊ทผ์ด๋ ๋ฒฝ์ ํต๊ณผํ ์ ์๊ณ , ๋ถ์ด ์ฎ๊ฒจ์ง ์นธ ๋๋ ์ด์ ๋ถ์ด ๋ถ์ผ๋ ค๋ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค. ์๊ทผ์ด๊ฐ ์๋ ์นธ์ ๋ถ์ด ์ฎ๊ฒจ์ด๊ณผ ๋์์ ๋ค๋ฅธ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค.
๋น๋ฉ์ ์ง๋๊ฐ ์ฃผ์ด์ก์ ๋, ์ผ๋ง๋ ๋นจ๋ฆฌ ๋น๋ฉ์ ํ์ถํ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
๐์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ํ ์คํธ ์ผ์ด์ค๋ ์ต๋ 100๊ฐ์ด๋ค.
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ๋น๋ฉ ์ง๋์ ๋๋น์ ๋์ด w์ h๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ w,h ≤ 1000)
๋ค์ h๊ฐ ์ค์๋ w๊ฐ์ ๋ฌธ์, ๋น๋ฉ์ ์ง๋๊ฐ ์ฃผ์ด์ง๋ค.
'.': ๋น ๊ณต๊ฐ
'#': ๋ฒฝ
'@': ์๊ทผ์ด์ ์์ ์์น
'*': ๋ถ
๊ฐ ์ง๋์ @์ ๊ฐ์๋ ํ๋์ด๋ค.
๐์ถ๋ ฅ
์ฒซ์งธ ์ค์ ํ์ดํ์ ํ์ชฝ ๋์ (N, N)์ผ๋ก ์ด๋์ํค๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ์ถ๋ ฅํ๋ค. ์ด๋์ํฌ ์ ์๋ ๊ฒฝ์ฐ์๋ 0์ ์ถ๋ ฅํ๋ค. ๋ฐฉ๋ฒ์ ์๋ ํญ์ 1,000,000๋ณด๋ค ์๊ฑฐ๋ ๊ฐ๋ค.
๐ ๋ฌธ์ ํ์ด
ํํ ๋ณผ ์ ์๋ BFS ๋ฌธ์ ์ ์ ํ์ด์๋ค.
A์์ B๋ก ๊ฐ ๋์ ์์์๊ฐ์ ๊ตฌํ๋ ๋ฌธ์ ์๊ณ , A๋ @์ ์์น ๊ทธ๋ฆฌ๊ณ B๋ #์ด ์๋ ๊ฐ์ฅ์๋ฆฌ์ด๋ค.
๋ค๋ง ๋ถ์ด๋ผ๋ ๋ณ์๊ฐ ์์๋ค. ๋ถ์ด ๋ถ์ ๊ณณ์ ์ด๋ํ ์ ์์๊ณ , ์ด ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ด ํ์ธํด์ค์ผ ํ๋ค.
๋ถ์ด ๋ถ๋ ๊ฒฝ๋ก์ ์๊ทผ์ด์ ์ด๋ ๊ฒฝ๋ก๋ฅผ ์ค์๊ฐ์ผ๋ก ํ์ธํ๋ ค๊ณ ํ๋ ์กฐ๊ธ ๋ณต์กํด์ก๋ค. ๊ทธ๋์ ๋จผ์ ๋ถ์ ์ง๋ฅด๊ณ ์๊ทผ์ด๋ฅผ ์ด๋์์ผฐ๋ค. ์ฆ ๊ฐ ๊ฒฝ๋ก๋ง๋ค ๋ถ์ด ๋ถ๋ ์๊ฐ์ ์ฒดํฌํด๋๋ค ์๊ทผ์ด๊ฐ ๊ทธ ์ง์ ์ ์ค๋ ์๊ฐ๊ณผ ๋น๊ตํ์ฌ ์๊ทผ์ด๊ฐ ์ง๋๊ฐ ์ ์๋ ๊ณณ์ธ์ง ์๋์ง๋ฅผ ํ์ ํ์๋ค.
๋ถ์ ์ด๊ธฐ ์์น๋ฅผ ํ์ ์ฝ์ ํ๊ณ BFS๋ฅผ ํตํด '#'์ ๋นผ๊ณ ๋ถ์ ์ง๋ ๋ค.
๋ถ์ด ๋ถ์ ์๊ฐ์ด ๋ด๊ธด ๋ฐฐ์ด์ ๊ฐ๊ณ ์ด์ ์๊ทผ์ด๋ฅผ ์์ง์๋ค.
์๊ทผ์ด๊ฐ ์ด๋ํ ์ ์๋ ๊ฒฝ๋ก๋ '#'์ด ์๋๊ณ ๋ถ์ด ๋ถ์ ์๊ฐ๋ณด๋ค ์๊ทผ์ด๊ฐ ๋ ๋นจ๋ฆฌ ๋์ฐฉํ ๊ฒฝ์ฐ์ด๋ค.
๐ป ์ฝ๋
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 | from collections import deque import sys input = sys.stdin.readline dx = [0,1,-1,0] dy = [1,0,0,-1] # ๋ถ ์ง๋ฅด๊ธฐ def burn(): while queue: x,y,t = queue.popleft() for i in range(4): nx = x + dx[i] ny = y + dy[i] # ๋ฒ์ ๋ฐ์ด๋ผ๋ฉด if nx < 0 or ny < 0 or nx >= h or ny >= w: continue # ๋ฒฝ์ด ์๋๊ณ ๋ฐฉ๋ฌธํ์ง ์์๋ค๋ฉด if graph[nx][ny] != '#' and visited[nx][ny] == 0: visited[nx][ny] = t + 1 queue.append([nx,ny,t+1]) return visited # ์๊ทผ์ด ์ด๋ def bfs(a,b): q = deque() q.append([a,b,1]) while q: x,y,c = q.popleft() # ํ์ถํ๋ค๋ฉด if x == h-1 or y == w-1 or x == 0 or y == 0: return c for i in range(4): nx = x+dx[i] ny = y+dy[i] # ๋ฒ์ ๋ฐ์ด๋ผ๋ฉด if nx < 0 or ny < 0 or nx >= h or ny >= w: continue # ๋ฒฝ์ด ์๋๋ผ๋ฉด if graph[nx][ny] != '#': # ๋ถ์ด ๋ถ๊ธฐ ์ ์ ์ด๋ํ๊ฑฐ๋ ์์ ๋ถ์ด ๋ถ์ง ์๋ ๊ณณ์ด๋ผ๋ฉด ๋ฐฉ๋ฌธ if c+1 < visit[nx][ny] and visit[nx][ny] != -1 or visit[nx][ny]==0: q.append([nx,ny,c+1]) visit[nx][ny] = -1 # ๋ฃจํ๋ฌธ ๋๋ฌ๋๋ฐ๋ ํ์ถํ์ง ๋ชปํ๋ค๋ฉด return 'IMPOSSIBLE' for _ in range(int(input())): w,h = map(int,input().split()) graph = [list(map(str,input().rstrip())) for _ in range(h)] # ๋ถ์ด ๋ถ์ ์์น ๋ด์ ํ queue = deque() visited = [[0]*(w) for _ in range(h)] for i in range(h): for j in range(w): # ํด๋น ๊ตฌ์ญ์ ๋ถ์ด ๋ถ์๋ค๋ฉด ํ์ ์ขํ ์ฝ์
if graph[i][j] == '*': queue.append([i,j,1]) visited[i][j] = 1 # ์๊ทผ์ด๊ฐ elif graph[i][j] == '@': sx,sy = i,j visit = burn() print(bfs(sx,sy)) | cs |
๐ญ ์ํ์ฐฉ์ค
๋ฌธ์ ์ ์์ด๋์ด๋ฅผ ์ป์ด๋ด๋๋ ์กฐ๊ธ ์๊ฐ์ด ๊ฑธ๋ ธ๋ค..ใ ใ ใ (์์์๋ ํํ ๋ณผ ์ ์๋ BFS๋ผ๋ฉฐ)
๐ ๋ฌธ์ ๋งํฌ ๋ถ
'Problem Solving > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค] 11780๋ฒ: ํ๋ก์ด๋ 2 - Python (0) | 2022.09.22 |
---|---|
[๋ฐฑ์ค] 14567๋ฒ: ์ ์๊ณผ๋ชฉ (Prerequisite) - ํ์ด์ฌ (0) | 2022.09.18 |
[๋ฐฑ์ค] 2174๋ฒ: ๋ก๋ด ์๋ฎฌ๋ ์ด์ - ํ์ด์ฌ (0) | 2022.09.04 |
[๋ฐฑ์ค] 1219๋ฒ: ์ค๋ฏผ์์ ๊ณ ๋ฏผ - ํ์ด์ฌ (๋ฒจ๋ง ํฌ๋, BFS) (2) | 2022.08.28 |
[๋ฐฑ์ค] 1016๋ฒ: ์ ๊ณฑใดใด์ - ํ์ด์ฌ (0) | 2022.08.27 |