๋ฌธ์
https://www.acmicpc.net/problem/6087
๋ด ๋ฌธ์ ํ์ด
import sys
import math
w, h = map(int, sys.stdin.readline().strip().split())
table = []
dx = [0, 0, -1, 1]
dy = [-1, 1, 0, 0]
points = [] # 'C'์ ์์น (์ฒ์ ์
๋ ฅ๋ฐ๋ ์์น๋ฅผ ์์์ , ๋์ค์ ์
๋ ฅ๋ฐ๋ ์์น๋ฅผ ๋์ฐฉ์ ์ผ๋ก ์ค์ ํจ)
for i in range(h):
now = list(sys.stdin.readline().strip())
for j in range(w):
if now[j] == 'C':
points.append((i, j))
table.append(now)
def bfs(x, y):
visited = [[[math.inf] * 4 for _ in range(w)] for _ in range(h)] # ๋ฐฉ๋ฌธ ์ฒดํฌ
queue = [] # ํ์ํ ์์น์ ์ ๋ณด (ํ, ์ด, ๋ฐฉํฅ)
idx = 0
# ๋ณธ๊ฒฉ์ ์ผ๋ก ํ์ ์ queue์ ๊ฐ์ฅ ๋จผ์ ํ์์ ์์ํ ์์น๋ค ์ถ๊ฐ
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 or table[nx][ny] == '*':
continue
queue.append((nx, ny, i)) # i๊ฐ์ ํตํด ๊ทธ ์ ๊น์ง ์ด๋ค ๋ฐฉํฅ์ผ๋ก ์์ง์๋์ง๋ฅผ ์ ์ ์๊ฒ ํจ
visited[nx][ny][i] = 0
while idx < len(queue):
(x, y, direct) = queue[idx]
idx += 1
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 or table[nx][ny] == '*':
continue
cnt = visited[x][y][direct] # ์ด์ ์๋ฆฌ์ ๋ฐฉํฅ ๊ฐ์ ํตํด ๊ฑฐ์ธ์ ์ถ๊ฐํด์ผ ํ๋์ง ์ ํ๊ธฐ ์ํจ
if (direct <= 1 and i > 1) or (direct > 1 and i <= 1):
cnt += 1
# ๋ฐฉ๋ฌธํ์ ์๋ ์๋ฆฌ์ผ ๊ฒฝ์ฐ, ๊ฑฐ์ธ ๊ฐ์ ๊ทธ๋๋ก ์ ์ฅ / ๋ฐฉ๋ฌธํ์ ์์ ๊ฒฝ์ฐ ๋ ์์ ๊ฐ์ผ๋ก ๊ฐฑ์
if visited[nx][ny][i] == -1:
visited[nx][ny][i] = cnt
queue.append((nx, ny, i))
elif visited[nx][ny][i] > cnt:
visited[nx][ny][i] = cnt
queue.append((nx, ny, i))
# ๋์ฐฉ ์ง์ ์ ์ ์ฅ๋ ๊ฑฐ์ธ ๊ฐ์ ์ค ๊ฐ์ฅ ์์ ์ ๋ฐํ
return min(visited[points[1][0]][points[1][1]])
# ์์ ์ง์ ์ขํ ๋ฃ์ด์ bfs ํจ์ ํธ์ถ
print(bfs(points[0][0], points[0][1]))
๐ BFS ๋ฌธ์ ๋ก, ๊ฐ ์๋ฆฌ๋ง๋ค ๋ค๋ฐฉํฅ์ผ๋ก์ ๊ฑฐ์ธ ๊ฐ์๋ฅผ ๊ณ ๋ คํด์ฃผ๋ฉด ๋๋ค.
[ ๋ฌธ์ ๋ถ์ ]
์ขํ๊ฐ ์ฐ์ฐ์ ํตํด ํ์์ด ํ์ํ ์๋ฆฌ๋ฅผ ์ฐพ๊ณ , queue์ ์ถ๊ฐํด์ฃผ์ด ๋์ด์ ํ์ํ ์๋ฆฌ๊ฐ ์์ ๋๊น์ง
๋ฐ๋ณตํด์ฃผ์ด์ผ ํ๋ฉฐ, ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํตํด ํ์์๋ ์ค๋ณต์ ํผํด์ผ ํ๋ค๋ ์ ์ ์ผ๋ฐ์ ์ธ BFS ๋ฌธ์ ๋ค๊ณผ ๊ฐ๋ค.
๊ทธ๋ฌ๋ ์ด ๋ฌธ์ ๋ ์ผ๋ฐ์ ์ธ BFS ๋ฌธ์ ๋ค๊ณผ ๊ฐ์ฅ ํฐ ๋ ๊ฐ์ง ์ฐจ์ด์ ์ด ์๋ค.
(1) ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ๋, ์ค๋ณต์ ํผํ๊ธฐ ์ํจ์ด ์๋๋ผ ์ ์ ํ ์ต์๊ฐ์ ๊ฐฑ์ ํด ์ฃผ๊ธฐ ์ํจ์ด๋ผ๋ ๊ฒ
(2) ๋ฐฉ๋ฌธ ์ฒดํฌ ์ True, False๊ฐ ์๋๋ผ, ๋์๋จ๋ถ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ฅผ ๊ณ ๋ คํ์ฌ ๊ฐ์ ์ ์ฅํด์ผ ํ๋ค๋ ๊ฒ
์ด๋ฌํ ํน์ง์ ์ ์๊ฐํ์ฌ ๋ฌธ์ ๋ฅผ ํ์ดํด์ฃผ์ด์ผ ํ๋ค.
[ ํ์ด ์ค๋ช ]
- ์ฃผ์ด์ง ์ง๋ ์ ๋ณด๋ฅผ table ๋ฆฌ์คํธ์ ์ ์ฅํด์ฃผ์๊ณ , 'C' ๋ฐ๊ฒฌ ์ ๊ทธ ์ขํ๊ฐ์ point ๋ฆฌ์คํธ์ ์ ์ฅํ๋ค.
๋ฐ๋ผ์ ์ด point ๋ฆฌ์คํธ๋ 'C'์ ์์์ ๊ณผ ๋์ฐฉ์ ์ ๋ํ ์ ๋ณด๋ฅผ ๊ฐ์ง๊ฒ ๋๋ค.
(bfs ํจ์ ํธ์ถ ์ ์์์ ์ขํ๋ฅผ ํ๋ผ๋ฏธํฐ๋ก ์ ๋ฌํ๊ณ , bfs ํจ์ ๋ฐํ ์์๋ ๋์ฐฉ์ ์ขํ๋ฅผ ์ด์ฉํ๋ค.) - bfs ํจ์๊ฐ ์คํ๋๋ฉด visited, queue, idx๋ฅผ ์์ฑํ๋ค.
visited๋ ๋ฐฉ๋ฌธ ์ฒดํฌ๋ฅผ ํ๊ธฐ ์ํจ์ธ๋ฐ, 3์ค ๋ฆฌ์คํธ๋ก ๋ง๋ค์ด์ ๊ฐ์ฅ ๋ง๋จ์๋
๋์๋จ๋ถ ๋ค ๋ฐฉํฅ์ผ๋ก์ ๋ชจ๋ ๊ฑฐ์ธ์ ๊ฐ์์ ๋ํ ๊ฒฝ์ฐ์ ์๋ฅผ ์ ์ฅํ ์ ์๊ฒ ํ์๋ค.
queue๋ ์์ผ๋ก ํ์์ด ํ์ํ ์ขํ๋ค์ ๋ํ ๊ฐ์ ์ ์ฅํ๊ธฐ ์ํด ์์ฑํ๊ณ ,
idx๋ queue ๋ฆฌ์คํธ๋ฅผ ๋๋ฉด์ ์์๋๋ก ํ์์ ๋๊ธฐ ์ํด ์ ์ธํ๋ค. (deque ์ฌ์ฉํด๋ ok) - while์ ํตํด ๋ณธ๊ฒฉ์ ์ผ๋ก ํ์์ ์์ํ๊ธฐ ์ ์, ๊ฐ์ฅ ๋จผ์ ํ์ํ ์๋ฆฌ๋ค์ queue์ ์ถ๊ฐํ๋ค.
์์์ ์ ์ญํ ์ ํ๋ 'C'์ ๋์๋จ๋ถ์ ์์นํ๋ ์ขํ๋ค์ด ์ด์ ํด๋น๋๋๋ฐ,
์ง๋์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ๋ฒฝ์ด ์๋ ๊ฒฝ์ฐ์๋ ๋ชจ๋ queue์ ์ถ๊ฐํ๊ณ ,
๋ชจ๋ ๋ฐฉํฅ์์ ์์ง ๊ฑฐ์ธ์ ์ฌ์ฉํ์ง ์์์ผ๋ฏ๋ก visited์๋ 0์ ์ ์ฅํ๋ค. - while ์์์๋ idx ๊ฐ์ ๋ฐ๋ผ ํ์ฌ ์์์ queue ์ธ๋ฑ์ค๋ฅผ x, y, direct๋ก ๋ฐ์์๋ค.
for๋ฌธ์ ํตํด 4๋ฒ ๋ฐ๋ณตํ๋ฉฐ ํ์ฌ ์๋ฆฌ์ ๋ค๊ฐ์ง ๋ฐฉํฅ์ ๊ณ ๋ คํด์ฃผ์๋๋ฐ,
๋ง์ฐฌ๊ฐ์ง๋ก ์ง๋์ ๋ฒ์๋ฅผ ๋ฒ์ด๋๊ฑฐ๋ ๋ฒฝ์ด ์์ ๊ฒฝ์ฐ๋ ์์ธ์ฒ๋ฆฌํ๋ค. - ์ฌ๊ธฐ์ ์๊ฐํด์ฃผ์ด์ผ ํ ๊ฒ์, ์๋กญ๊ฒ ํ์์ ๊ณ ๋ คํ๋ ์ขํ(nx, ny)๋ก ๊ฐ๋ ๋ฐฉํฅ์ด
๊ทธ ์ ์ ์ด๋ํ๋ ๋ฐฉํฅ๊ณผ ๊ฐ์์ง, ๋ค๋ฅธ์ง๋ฅผ ํ๋จํด์ฃผ์ด์ผ ํ๋ค๋ ๊ฒ์ด๋ค.
๋ด ์ฝ๋์ ๊ฒฝ์ฐ dx, dy ๋ฆฌ์คํธ๋ฅผ ํ์ธํ๋ฉด visited[x][y][direct]์์ direct ์ธ๋ฑ์ค๊ฐ
0, 1์ผ ๊ฒฝ์ฐ์๋ ์์ง์ผ๋ก ์ด๋, 2, 3์ผ ๊ฒฝ์ฐ์๋ ์ํ์ผ๋ก ์ด๋ํ์์์ ์ ์ ์๋ค.
=> direct๊ฐ 1์ดํ์ด๋ฉฐ i๊ฐ 2 ์ด์์ผ ๊ฒฝ์ฐ, ํน์ direct๊ฐ 2์ด์์ด๋ฉฐ i๊ฐ 1 ์ดํ์ผ ๊ฒฝ์ฐ์๋
๊ทธ ์ ๊ณผ ๋ค๋ฅธ ๋ฐฉํฅ์ผ๋ก ๋์๊ฐ๊ณ ์ ํ๋ ๊ฒ์ด๋ฏ๋ก, cnt๋ฅผ 1 ํค์์ค๋ค. (๊ฑฐ์ธ ์ถ๊ฐ) - ๊ทธ๋ฆฌ๊ณ visited์ ํด๋น ์ธ๋ฑ์ค์ -1์ด ์ ์ฅ๋์ด์๋ค๋ฉด ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ์๋ฆฌ์ด๋ฏ๋ก cnt๋ฅผ ๊ทธ๋๋ก ์ถ๊ฐ,
ํด๋น ์ธ๋ฑ์ค์ cnt๋ณด๋ค ํฐ ๊ฐ์ด ์ ์ฅ๋์ด์๋ค๋ฉด ํ์ฌ์ cnt ๊ฐ์ผ๋ก ๊ฐฑ์ ํด์ฃผ์๋ค.
(๊ฑฐ์ธ์ ์ต์๋ก ์ฌ์ฉํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ฏ๋ก ๊ณ์ํ์ฌ ์ต์๊ฐ์ผ๋ก ๊ฐฑ์ ) - queue์ ์๋ ๋ชจ๋ ์ขํ๋ฅผ ํ์ํ๋ค๋ฉด ๋์ฐฉ ์ง์ ์ขํ์ visited ์ค ๊ฐ์ฅ ์์ ๊ฐ์ ๋ฐํํ๋ค.
๐ก ํผ๋๋ฐฑ
- ์์ธ๋ ๊ต์ฅํ ๋ง๊ณ ๊ณ ๋ คํด์ค ๋ถ๋ถ์ด ๋ง์์ ์์ฃผ ์ค๋ ๊ฑธ๋ ธ๋ ๋ฌธ์ ๋ค.
๊ทธ๋๋ ๋๋ถ์ BFS๋ฅผ ๋ ์ ์๊ฒ ๋ ๋ฏ
'4๏ธโฃ Python > Problem Solving' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[Python Algorithm] ๋ณด๊ธ๋ก SWEA #1249 (0) | 2022.07.05 |
---|---|
[Python Algorithm] ๊ฐ์ฅ ๊ธด ๋ฐ์ดํ ๋ ๋ถ๋ถ ์์ด BOJ #11054 (0) | 2022.06.27 |
[Python Algorithm] ํ๋ก์ด๋ BOJ #11404 (0) | 2022.06.23 |
[Python Algorithm] ๊ฒฝ๋ก ์ฐพ๊ธฐ BOJ #11403 (feat. BFS, ํ๋ก์ด๋ ์์ ) (0) | 2022.06.23 |
[Python Algorithm] ๊ฐ์ด๋ฐ๋ฅผ ๋งํด์ BOJ #1655 (0) | 2022.06.14 |
๋๊ธ