โ๋ฌธ์
https://www.acmicpc.net/problem/7576
์ฝ๋1 โก๏ธ ๋ฉ๋ชจ๋ฆฌ: 156792 KB, ์๊ฐ: 460 ms
์ฝ๋2 โก๏ธ ๋ฉ๋ชจ๋ฆฌ: 228982 KB, ์๊ฐ: 448 ms
์ฒ ์์ ํ ๋งํ ๋์ฅ์์๋ ํ ๋งํ ๋ฅผ ๋ณด๊ดํ๋ ํฐ ์ฐฝ๊ณ ๋ฅผ ๊ฐ์ง๊ณ ์๋ค. ํ ๋งํ ๋ ์๋์ ๊ทธ๋ฆผ๊ณผ ๊ฐ์ด ๊ฒฉ์ ๋ชจ์ ์์์ ์นธ์ ํ๋์ฉ ๋ฃ์ด์ ์ฐฝ๊ณ ์ ๋ณด๊ดํ๋ค.
์ฐฝ๊ณ ์ ๋ณด๊ด๋๋ ํ ๋งํ ๋ค ์ค์๋ ์ ์ต์ ๊ฒ๋ ์์ง๋ง, ์์ง ์ต์ง ์์ ํ ๋งํ ๋ค๋ ์์ ์ ์๋ค. ๋ณด๊ด ํ ํ๋ฃจ๊ฐ ์ง๋๋ฉด, ์ต์ ํ ๋งํ ๋ค์ ์ธ์ ํ ๊ณณ์ ์๋ ์ต์ง ์์ ํ ๋งํ ๋ค์ ์ต์ ํ ๋งํ ์ ์ํฅ์ ๋ฐ์ ์ต๊ฒ ๋๋ค. ํ๋์ ํ ๋งํ ์ ์ธ์ ํ ๊ณณ์ ์ผ์ชฝ, ์ค๋ฅธ์ชฝ, ์, ๋ค ๋ค ๋ฐฉํฅ์ ์๋ ํ ๋งํ ๋ฅผ ์๋ฏธํ๋ค. ๋๊ฐ์ ๋ฐฉํฅ์ ์๋ ํ ๋งํ ๋ค์๊ฒ๋ ์ํฅ์ ์ฃผ์ง ๋ชปํ๋ฉฐ, ํ ๋งํ ๊ฐ ํผ์ ์ ์ ๋ก ์ต๋ ๊ฒฝ์ฐ๋ ์๋ค๊ณ ๊ฐ์ ํ๋ค. ์ฒ ์๋ ์ฐฝ๊ณ ์ ๋ณด๊ด๋ ํ ๋งํ ๋ค์ด ๋ฉฐ์น ์ด ์ง๋๋ฉด ๋ค ์ต๊ฒ ๋๋์ง, ๊ทธ ์ต์ ์ผ์๋ฅผ ์๊ณ ์ถ์ด ํ๋ค.
ํ ๋งํ ๋ฅผ ์ฐฝ๊ณ ์ ๋ณด๊ดํ๋ ๊ฒฉ์๋ชจ์์ ์์๋ค์ ํฌ๊ธฐ์ ์ต์ ํ ๋งํ ๋ค๊ณผ ์ต์ง ์์ ํ ๋งํ ๋ค์ ์ ๋ณด๊ฐ ์ฃผ์ด์ก์ ๋, ๋ฉฐ์น ์ด ์ง๋๋ฉด ํ ๋งํ ๋ค์ด ๋ชจ๋ ์ต๋์ง, ๊ทธ ์ต์ ์ผ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ๋ผ. ๋จ, ์์์ ์ผ๋ถ ์นธ์๋ ํ ๋งํ ๊ฐ ๋ค์ด์์ง ์์ ์๋ ์๋ค.
โ๐ปํ์ด
BFS ๋ฌธ์ ์ด๋ค.
์ต์ง ์์ ํ ๋งํ ๋ ์ต์ ํ ๋งํ ์ ์ํฅ์ ๋ฐ์ ์ต๋๋ค. ์ต์ ํ ๋งํ ๋ ์ค๋ฅธ์ชฝ, ์ผ์ชฝ, ์, ๋ค์๋ง ์ํฅ์ ์ค ์ ์๋ค.
๊ทธ๋ฌ๋ฏ๋ก ํ
์คํธ ์ผ์ด์ค 2์ ๊ฐ์ด (0, 0)์ ์์นํ ํ ๋งํ ๋ ์ฃผ์์ ์ต์ ํ ๋งํ ๊ฐ ์์ผ๋ฏ๋ก ์ต์ ์ ์๋ค.
๋จผ์ ์ถ๋ฐ์ง๋ฅผ ์ฐพ๊ธฐ ์ํด ์ต์ ํ ๋งํ ์ ์์น๋ฅผ ํ์ ๊ธฐ๋กํ๋ค.
์ต์ ํ ๋งํ ๋ฅผ ๊ธฐ์ ์ผ๋ก ์ค๋ฅธ์ชฝ, ์ผ์ชฝ, ์, ๋ค๋ฅผ ํ์ธํ๋ค. ์ด ๋, ์์ง ์ต์ง ์์ ํ ๋งํ ๋ผ๋ฉด ํ์ฌ ํ ๋งํ ๋ฅผ ๊ธฐ์ ์ผ๋ก +1์ ํ๋ค.
boxes๋ฅผ ํ์ธํ์ ๋ ์ต์ง ์์ ํ ๋งํ ๊ฐ ์๋ค๋ฉด -1์ ์ถ๋ ฅํ๊ณ ์ด์ธ์๋ ์ต์ ๋ ์ง๋ฅผ ์ถ๋ ฅํ๋ค.
๐ป์ฝ๋
์ฝ๋ 1
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
boxes = [list(map(int, input().split())) for _ in range(m)]
dir = [[1, 0], [-1, 0], [0, 1], [0, -1]]
q = deque()
for i in range(m):
for j in range(n):
if boxes[i][j] == 1:
q.append((i, j))
def bfs():
res = 0
while q:
y, x = q.popleft()
for d in dir:
ny, nx = y + d[0], x + d[1]
if 0 <= ny < m and 0 <= nx < n:
if boxes[ny][nx] == 0:
boxes[ny][nx] = boxes[y][x] + 1
q.append((ny, nx))
for i in range(m):
for j in range(n):
if boxes[i][j] == 0:
return -1
res = max(res, boxes[i][j])
return res - 1
print(bfs())
์ฝ๋ 2
import sys
from collections import deque
input = sys.stdin.readline
n, m = map(int, input().split())
boxes = [list(map(int, input().split())) for _ in range(m)]
dir = [[1, 0], [-1, 0], [0, 1], [0, -1]]
q = deque()
for i in range(m):
for j in range(n):
if boxes[i][j] == 1:
q.append((i, j, 0))
def bfs():
res = 0
while q:
y, x, day = q.popleft()
for d in dir:
ny, nx = y + d[0], x + d[1]
if 0 <= ny < m and 0 <= nx < n:
if boxes[ny][nx] == 0:
boxes[ny][nx] = 1
q.append((ny, nx, day + 1))
res = max(res, day + 1)
for i in range(m):
for j in range(n):
if boxes[i][j] == 0:
return -1
return res
print(bfs())
๐ํ๊ธฐ
์ด ์ ๋๋ฉด ์ฌ๊ฐํ ๋๋ ์๋๊ฐ ์ถ๋ค..๊ทธ๋ฆผ์ ๊ทธ๋ฆฌ๋ฉด์ ์ด๊ฑด bfs์ธ๋ฐ ์ด๋ป๊ฒ dfs์ด์ง ์๊ฐํ๋ฉด์ ๋ฌธ์ ๋ ๋ด ๋์ด๋ค. bfs๋ฅผ dfs๋ก ์ฝ๊ณ ์ด๊ฑธ dfs๋ก ํ๋ ค๊ณ ํ๋ค. ์์นจ๋ถํฐ ํ๋ ค๋๊น ์ ์ด ๋ ๊นผ๋..
์ฝ๋ 1์ ํ ๋งํ ๊ฐ ๋ด๊ฒจ์๋ ์์๋ฅผ ๊ทธ๋๋ก ์ด์ฉํ์ฌ ๋ ์ง๋ฅผ ๊ธฐ๋กํ์๋ค. ๊ทธ๋ฆฌ๊ณ for๋ฌธ์ ๋๋ฉฐ ํ ๋งํ ๊ฐ ๋ชจ๋ ์ต์ ๋๊น์ง ๊ฑธ๋ฆฌ๋ ๋ ์ง๋ฅผ ๊ตฌํ๋ค. ์ด ๋, n * m๋ฒ max ํจ์๋ฅผ ๋ฐ๋ณตํ๊ธฐ ๋๋ฌธ์ while์ ๊ณ์ฐํ๋ ๊ฒ ์ด๋จ๊น ์๊ฐํ๋ค. ๊ทธ๊ฒ ๋ฐ๋ก ์ฝ๋2์ด๋ค.
์ฝ๋ 2๋ ์ต์ง ์์ ํ ๋งํ ๋ผ๋ฉด ์ด๋ฅผ 1๋ก ๋ฐ๊ฟ ์ต์์ ํ์ํ๊ณ ํ์ ๋ค์ ์์ ์์น๋ฅผ ๊ธฐ๋กํ ๋ ๋ ์ง์ ํจ๊ป ๊ธฐ๋กํ๊ณ ์ด ๋, ๋ ์ง๋ฅผ ๊ฐฑ์ ํ๋ค. ๊ทธ๋ ๊ธฐ์ ์๊ฐ์ ์ฝ๋1์ ๋นํด ์ค์ด๋ค์ง๋ง ๋ฉ๋ชจ๋ฆฌ๋ ์กฐ๊ธ ๋ ์ฐจ์งํ๊ฒ ๋๋ค.