์ฐจ์ธ๋ ์๋์ธ ํ๋๋ ๊ฐ์๋ ๊ณ ๋ญ์ง์์ ์ ๊ธฐ๋ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๊ธฐ๋ก ํ์๋ค. ๋์ฝ์ ์ฐ์ง ์๊ณ ย ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ค๋ฉด ๋ฐฐ์ถ๋ฅผ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธํ๋ ๊ฒ์ด ์ค์ํ๊ธฐ ๋๋ฌธ์, ํ๋๋ ํด์ถฉ ๋ฐฉ์ง์ย ํจ๊ณผ์ ์ธ ๋ฐฐ์ถํฐ์ง๋ ์ด๋ฅผ ๊ตฌ์ ํ๊ธฐ๋ก ๊ฒฐ์ฌํ๋ค. ์ด ์ง๋ ์ด๋ ๋ฐฐ์ถ๊ทผ์ฒ์ ์์ํ๋ฉฐ ํด์ถฉ์ ์ก์ย ๋จน์์ผ๋ก์จ ๋ฐฐ์ถ๋ฅผ ๋ณดํธํ๋ค. ํนํ, ์ด๋ค ๋ฐฐ์ถ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ผ๋ ์ด๊ณ ์์ผ๋ฉด ์ด ์ง๋ ์ด๋ ์ธ์ ํ ๋ค๋ฅธ ๋ฐฐ์ถ๋ก ์ด๋ํ ์ ์์ด, ๊ทธ ๋ฐฐ์ถ๋ค ์ญ์ ํด์ถฉ์ผ๋ก๋ถํฐ ๋ณดํธ๋ฐ์ ์ ์๋ค. ํ ๋ฐฐ์ถ์ ์ํ์ข์ฐ ๋ค ๋ฐฉํฅ์ ๋ค๋ฅธ ๋ฐฐ์ถ๊ฐ ์์นํ ๊ฒฝ์ฐ์ ์๋ก ์ธ์ ํด์๋ ๊ฒ์ด๋ค.
ํ๋๊ฐ ๋ฐฐ์ถ๋ฅผ ์ฌ๋ฐฐํ๋ ๋ ์ ๊ณ ๋ฅด์ง ๋ชปํด์ ๋ฐฐ์ถ๋ฅผ ๊ตฐ๋ฐ๊ตฐ๋ฐ ์ฌ์ด ๋์๋ค. ๋ฐฐ์ถ๋ค์ด ๋ชจ์ฌ์๋ ๊ณณ์๋ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ ๋ง๋ฆฌ๋ง ์์ผ๋ฉด ๋๋ฏ๋ก ์๋ก ์ธ์ ํด์๋ ๋ฐฐ์ถ๋ค์ด ๋ช ๊ตฐ๋ฐ์ ํผ์ ธ์๋์ง ์กฐ์ฌํ๋ฉด ์ด ๋ช ๋ง๋ฆฌ์ ์ง๋ ์ด๊ฐ ํ์ํ์ง ์ ์ ์๋ค. ์๋ฅผ ๋ค์ด ๋ฐฐ์ถ๋ฐญ์ด ์๋์ ๊ฐ์ด ๊ตฌ์ฑ๋์ด ์์ผ๋ฉด ์ต์ 5๋ง๋ฆฌ์ ๋ฐฐ์ถํฐ์ง๋ ์ด๊ฐ ํ์ํ๋ค. 0์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์์ง ์์ ๋ ์ด๊ณ , 1์ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ๋ ์ ๋ํ๋ธ๋ค.
| 1 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
|---|---|---|---|---|---|---|---|---|---|
| 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 |
| 0 | 0 | 1 | 1 | 0 | 0 | 0 | 1 | 1 | 1 |
| 0 | 0 | 0 | 0 | 1 | 0 | 0 | 1 | 1 | 1 |
์ ๋ ฅ์ ์ฒซ ์ค์๋ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์ T๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ ์ค๋ถํฐ ๊ฐ๊ฐ์ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ์ฒซ์งธ ์ค์๋ ๋ฐฐ์ถ๋ฅผ ์ฌ์ ๋ฐฐ์ถ๋ฐญ์ ๊ฐ๋ก๊ธธ์ด M(1 โค M โค 50)๊ณผ ์ธ๋ก๊ธธ์ด N(1 โค N โค 50), ๊ทธ๋ฆฌ๊ณ ๋ฐฐ์ถ๊ฐ ์ฌ์ด์ ธ ์๋ ์์น์ ๊ฐ์ K(1 โค K โค 2500)์ด ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ K์ค์๋ ๋ฐฐ์ถ์ ์์น X(0 โค X โค M-1), Y(0 โค Y โค N-1)๊ฐ ์ฃผ์ด์ง๋ค. ๋ ๋ฐฐ์ถ์ ์์น๊ฐ ๊ฐ์ ๊ฒฝ์ฐ๋ ์๋ค.
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ๋ํด ํ์ํ ์ต์์ ๋ฐฐ์ถํฐ์ง๋ ์ด ๋ง๋ฆฌ ์๋ฅผ ์ถ๋ ฅํ๋ค.
๋ฐฐ์ด์ ์ํํ๋ค๊ฐ ์ง๋ ์ด๋ฅผ ํ ๋ง๋ฆฌ์ฉ ๋ฟ๋ฆฌ๊ณ ์ง๋ ์ด๊ฐ ๋จน์ด๋ฅผ ๋ค ๋จน์ผ๋ฉด ๋ค์์ผ๋ก ๋ฐ๊ฒฌ๋ 1์์ ๋ค์ ์ง๋ ์ด๋ฅผ ๋๊ณ ๋จน์ด๋ฅผ ๋จน์ด๋ ์์ผ๋ก ํด๊ฒฐํ๋ค. ์ง๋ ์ด๊ฐ ๋จน์ด๋ฅผ ๋จน๋ ํจ์๋ฅผ ๋ง๋ค๊ณ ์ํ์ข์ฐ์ ์ฌ๊ท๋ฅผ ์ด์ฉํด์ ํจ์๋ฅผ ๋ฟ๋ฆฌ๋ ์์ผ๋ก ๊ตฌํํ๋ค.
์ ๋์๊ฐ๋ ์ฝ๋์ธ๋ฐ ์ฌ๊ท ์ค๋ฅ๊ฐ ๋์ ๋ณด๋ ๋ฐฑ์ค์์ ์ฌ๊ท ์ ํ์ด ์๋ค๊ณ ํ๋ค. ์ฌ๊ท ์ ํ์ ํธ๋ ๋ฐฉ๋ฒ์ ์จ์ผ ์ฌ๊ท ์ค๋ฅ๊ฐ ๋์ง ์๋๋ค.
์ฌ๊ท๋ฅผ ์ฌ์ฉํ๋ฉด ์ฌ๊ท๊ฐ ์ฌ๊ท๋ฅผ ๋ถ๋ฌ์ ์ฌ๊ท๊ฐ ๋ค๋ฅธ ์ฌ๊ท๋ฅผ ๋ถ๋ฅด์ง ์๊ณ ๊ฐ์ ๋ฐํํ ๋ ๊น์ง ์ฌ๊ท์ ๊น์ด๊ฐ ๊น์ด์ง๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ ๊น์ด ์ฐ์ ํ์์ด๋ผ๊ณ ํ ์ ์๋ค. ๋ฐฐ์ถ๊ฐ ์ด์ด์ง ๋๊น์ง ๋ค์ด๊ฐ์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ๋๋ฌธ์ด๋ค.
import sys
sys.setrecursionlimit(10**6)#์ฌ๊ท ์ ํ ํ๊ธฐ
def eat(field_arr, x, y):
# ๋ฐญ์ ๋ฒ์ด๋๊ฑฐ๋ ๋ฐฐ์ถ๊ฐ ์๊ฑฐ๋ ์ด๋ฏธ ๋จน์ ๊ณณ(0์ธ ๊ณณ) ๋ง๋๋ฉด ๋๋จ.
if y < 0 or y >= len(field_arr) or x < 0 or x >= len(field_arr[0]) or field_arr[y][x] == 0:
return
# ๋จน์ ๊ณณ์ 0์ผ๋ก ํ์
field_arr[y][x] = 0
# ์๊ธฐ ์ง๋ ์ด๋ฅผ ์ฌ๋ฐฉ์ ๋ฟ๋ฆฌ๊ธฐ
eat(field_arr, x, y + 1)
eat(field_arr, x, y - 1)
eat(field_arr, x + 1, y)
eat(field_arr, x - 1, y)
def count_worms(field):#๋ฐฐ์ถ๊ฐ ๋ฐ๊ฒฌ๋๋ฉด ๋จน์ด๊ณ ๋ค ๋จน์ผ๋ฉด ๋ค์ ๋ฐฐ์ถ์ฐพ๊ธฐ
if not field:
return 0
count = 0
for y in range(len(field)):
for x in range(len(field[0])):
if field[y][x] == 1:
eat(field, x, y)
count += 1
return count # ๋ช ๋ฒ๋จน์๋์ง ์๋ ค์ฃผ๊ธฐ
T = int(sys.stdin.readline())
for i in range(T):
M, N, K = map(int, sys.stdin.readline().split())
field = [[0 for _ in range(M)] for _ in range(N)]
for xy in range(K):
x, y = map(int, sys.stdin.readline().split())
field[y][x] = 1
# ์ง๋ ์ด ์ ๊ณ์ฐ
print(count_worms(field))
์ฌ๊ท ์ค๋ฅ ์์ด ํ๊ธฐ ์ํด์๋ ๋ฐ๋ณต๋ฌธ์ผ๋ก ๋ฌธ์ ๋ฅผ ํด๊ฒฐํด์ผ ํ๋๋ฐ ํด์ผ ํ ์ผ์ ์์ฐจ์ ์ผ๋ก ๊ธฐ์ตํ๋ ํ๋ก ์์
๋๊ธฐ์ด์ ๋ง๋ค์๋ค.
import sys
from collections import deque
def bfs_eat(field_arr, start_x, start_y):
queue = deque([(start_x, start_y)])
while queue:
x, y = queue.popleft()#ํ์์ ๋จน์ด์ขํ ๊บผ๋ด๊ธฐ
# ํ์ฌ ์์น์์ ์ฌ๋ฐฉ ํ์
for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
nx, ny = x + dx, y + dy
# ๋ฐญ์ ๋ฒ์ด๋๊ฑฐ๋ ๋ฐฐ์ถ๊ฐ ์๊ฑฐ๋ ์ด๋ฏธ ๋จน์ ๊ณณ(0์ธ ๊ณณ) ๋ง๋๋ฉด ๋ฌด์
if ny < 0 or ny >= len(field_arr) or nx < 0 or nx >= len(field_arr[0]) or field_arr[ny][nx] == 0:
continue
# ๋จน์ ๊ณณ์ 0์ผ๋ก ํ์
field_arr[ny][nx] = 0
queue.append((nx, ny))#์๋ก ๋ง๋ ๊ณณ์ ์์
ํ์ ๋ฃ๊ธฐ
def count_worms(field):
if not field:
return 0
count = 0
for y in range(len(field)):
for x in range(len(field[0])):
if field[y][x] == 1:
bfs_eat(field, x, y)
count += 1
return count
T = int(sys.stdin.readline())
for i in range(T):
M, N, K = map(int, sys.stdin.readline().split())
field = [[0 for _ in range(M)] for _ in range(N)]
for xy in range(K):
x, y = map(int, sys.stdin.readline().split())
field[y][x] = 1
# ์ง๋ ์ด ์ ๊ณ์ฐ
print(count_worms(field))
DFS๋ ์คํ์ด๋ ์ฌ๊ท๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ๊น์ ๋ ธ๋๋ฅผ ๋จผ์ ํ์ํ๋ ๋ฐ๋ฉด, BFS๋ ํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ๊ฐ๊น์ด ๋ ธ๋๋ถํฐ ์์ฐจ์ ์ผ๋ก ํ์ํฉ๋๋ค.
์ด ๊ณผ์ ์์ ์คํ๊ณผ ํ์ ๋ํด ๊ณต๋ถํด๋ณด๊ธฐ๋ก ํ๋ค.
๊ทธ๋์โฆ.
์ ๊ณต๋ถํ๋ค.
๊ทธ๋ฆฌ๊ณ ์์ฉ ๋ฌธ์ ๋ฅผ ๋ฐ๊ฒฌํด์ ํ์ด๋ณด์๋ค.
from collections import deque
def ripe_days(M, N, box):
movements = [(0, 1), (1, 0), (0, -1), (-1, 0)] # ์, ํ, ์ข, ์ฐ
queue = deque()
total_tomatoes = 0
riped_tomatoes = 0
# ์ด๊ธฐ ์ต์ ํ ๋งํ ์ ์์น๋ฅผ ํ์ ์ฝ์
ํ๊ณ , ํ ๋งํ ์ ์ด ๊ฐ์๋ฅผ ๊ณ์ฐ
for i in range(N):
for j in range(M):
if box[i][j] == 1:
queue.append((i, j))
riped_tomatoes += 1
if box[i][j] != -1:
total_tomatoes += 1
days = 0
while queue:#๋ช ์ผ์ด ์ง๋ฌ๋ ์ดํด๋ณผ๊น์?
for _ in range(len(queue)):
x, y = queue.popleft()
for dx, dy in movements:
nx, ny = x + dx, y + dy
if 0 <= nx < N and 0 <= ny < M and box[nx][ny] == 0:
box[nx][ny] = 1
riped_tomatoes += 1
queue.append((nx, ny))
days += 1
if riped_tomatoes == total_tomatoes:
return days - 1 # ๋ง์ง๋ง ๋ ์๋ ์ถ๊ฐ ์ต์ ํ ๋งํ ๊ฐ ์์ผ๋ฏ๋ก ํ๋ฃจ๋ฅผ ๋นผ์ค
else:
return -1 # ๋ชจ๋ ํ ๋งํ ๊ฐ ์ต์ง ๋ชปํ๋ ๊ฒฝ์ฐ
import sys
M,N=map(int,input().split())
box = [[int(x) for x in y.split()] for y in sys.stdin.readlines()]
if sum([sum([z**2 for z in line])for line in box])==M*N:
print(0)
else:
print(ripe_days(M, N, box))
M, N: ์์์ ๊ฐ๋ก(M)์ ์ธ๋ก(N) ํฌ๊ธฐ๋ฅผ ์
๋ ฅ๋ฐ์ต๋๋ค.box:ย NxMย ํฌ๊ธฐ์ 2์ฐจ์ ๋ฆฌ์คํธ๋ก, ํ ๋งํ ์ ์ํ๋ฅผ ์ ์ฅํฉ๋๋ค. ์ฌ๊ธฐ์ย **1**์ ์ต์ ํ ๋งํ ,ย **0**์ ์ต์ง ์์ ํ ๋งํ ,ย **1**์ ํ ๋งํ ๊ฐ ์๋ ๊ณต๊ฐ์ ๋ํ๋
๋๋ค.ripe_daysย ํจ์:
movements: ์, ํ, ์ข, ์ฐ๋ก ์ด๋ํ ์ ์๋ ๋ฐฉํฅ์ ๋ํ๋ด๋ ํํ์ ๋ฆฌ์คํธ์
๋๋ค.queue: BFS ํ์์ ์ํ ํ๋ฅผ ์ด๊ธฐํํฉ๋๋ค.total_tomatoes**์ย **riped_tomatoes**๋ ๊ฐ๊ฐ ์์ ์์ ํ ๋งํ ์ด ๊ฐ์์ ์ด๋ฏธ ์ต์ ํ ๋งํ ์ ๊ฐ์๋ฅผ ์ถ์ ํฉ๋๋ค.