๋ถ๋ ธ์ ํ ๋งํ ...๐
์ ๊ทผ๋ฐฉ๋ฒ์ด ํ๋ ค์ ์๊ณ ๋ฆฌ์ฆ์ ๋ช๋ฒ์ฉ ์์ ํ๋ค
๐ผ ๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/7569
7569๋ฒ: ํ ๋งํ
์ฒซ ์ค์๋ ์์์ ํฌ๊ธฐ๋ฅผ ๋ํ๋ด๋ ๋ ์ ์ M,N๊ณผ ์์์ฌ๋ ค์ง๋ ์์์ ์๋ฅผ ๋ํ๋ด๋ H๊ฐ ์ฃผ์ด์ง๋ค. M์ ์์์ ๊ฐ๋ก ์นธ์ ์, N์ ์์์ ์ธ๋ก ์นธ์ ์๋ฅผ ๋ํ๋ธ๋ค. ๋จ, 2 โค M โค 100, 2 โค N โค 100,
www.acmicpc.net
- ํฐ์ด: ๊ณจ๋ V
- ๋ถ๋ฅ: ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๋๋น ์ฐ์ ํ์
โ TRIAL 1.
์ฝ๋
import sys
input = sys.stdin.readline
from collections import deque
M, N, H = map(int, input().split())
#fill tomatos (-1: no tomato, 0: raw tomato, 1: grown tomato)
tmt = [[[0 for _ in range(M)] for _ in range(N)] for _ in range(H)]
for h in range(H):
for n in range(N):
tmt[h][n] = list(map(int, input().split()))
#BFS
adjs = [(1, 0, 0), (-1, 0, 0), (0, 1, 0), (0, -1, 0), (0, 0, 1), (0, 0, -1)]
def BFS(v):
visited = [[[False for _ in range(M)] for _ in range(N)] for _ in range(H)]
queue = deque([(v, 0)])
visited[v[0]][v[1]][v[2]] = True
while queue:
v, cnt = queue.popleft()
for d in adjs:
new_v = [v[i]+d[i] for i in range(3)]
if 0<=new_v[0]<H and 0<=new_v[1]<N and 0<=new_v[2]<M:
if tmt[new_v[0]][new_v[1]][new_v[2]] == 1:
return cnt+1
elif not visited[new_v[0]][new_v[1]][new_v[2]] and tmt[new_v[0]][new_v[1]][new_v[2]] == 0:
visited[new_v[0]][new_v[1]][new_v[2]] = True
queue.append([new_v, cnt+1])
return -1
def solution():
maxcount = 0
for h in range(H):
for n in range(N):
for m in range(M):
if tmt[h][n][m] == 0:
cnt = BFS([h, n, m])
if cnt == -1:
return -1
if cnt > maxcount:
maxcount = cnt
return maxcount
print(solution())
์ฝ๋ ์ค๋ช
- ์ต์ ํ ๋งํ ์์ ํ ์คํ ์ฉ ์ตํ๊ฐ๋๊ฒ ์๋๋ผ,
- ๋ชจ๋ ์์ต์ ํ ๋งํ ์ ๋ํด ์ต์ ํ ๋งํ ๊น์ง์ ์ต๋จ๊ฑฐ๋ฆฌ๋ฅผ ๊ตฌํ๋ ๋ฐฉ์์ผ๋ก ํ
ํ๋ฆฐ ์์ธ
์๊ฐ์ด๊ณผ. ๊ทธ๋ฅ ๋ฌธ์ ์์ ์ฃผ์ด์ง ๋๋ก ์ต์ ํ ๋งํ ์์ ํ ์คํ ์ฉ ๋์๊ฐ๋ ๊ฒ ๋ ๋น ๋ฅด๋ค.
โ TRIAL 2.
์ฝ๋
import sys
input = sys.stdin.readline
from collections import deque
M, N, H = map(int, input().split())
#fill tomatos (-1: no tomato, 0: raw tomato, 1: grown tomato)
tmt = [[[0 for _ in range(M)] for _ in range(N)] for _ in range(H)]
for h in range(H):
for n in range(N):
tmt[h][n] = list(map(int, input().split()))
#list of grown tomatos
growns = []
num_target = 0
for h in range(H):
for n in range(N):
for m in range(M):
if tmt[h][n][m] == 1:
growns.append((h, n, m))
elif tmt[h][n][m] == 0:
num_target += 1
dhs = [1, -1, 0, 0, 0, 0]
dns = [0, 0, 1, -1, 0, 0]
dms = [0, 0, 0, 0, 1, -1]
cnt = 0
while num_target > 0:
new_target = num_target
growns_tmp = []
for vh, vn, vm in growns:
for dh, dn, dm in zip(dhs, dns, dms):
newh, newn, newm = vh+dh, vn+dn, vm+dm
if 0<=newh<H and 0<=newn<N and 0<=newm<M:
if tmt[newh][newn][newm] == 0:
tmt[newh][newn][newm] = 1
new_target -= 1
growns_tmp.append((newh, newn, newm))
if new_target == num_target:
cnt = -1
break
growns.extend(growns_tmp)
num_target = new_target
cnt += 1
print(cnt)
์์ ํ ๋ถ๋ถ
- ์ต์ ํ ๋งํ ์ ๋ชฉ๋ก์ ์ฒ์์ ์ ์ฅํ๊ณ ,
- ๋งค step๋ง๋ค ์ธ์ ํ ์ต์ง ์์ ํ ๋งํ ๋ค์ ์ตํ๋ค.
- ์ฒ์์ ์ต์ง ์์ ํ ๋งํ ์ ๊ฐฏ์๋ฅผ countํ๊ณ ,
- ๋งค step์ด ๋๋ ๋ ์ต์ง ์์ ํ ๋งํ ์ ๊ฐฏ์๊ฐ ์ค์ง ์์์ผ๋ฉด ์งํ์ ๋ฉ์ถ๊ณ -1์ ๋ฐํ, (๋์ด์ ์งํํ ์ ์์)
- ์ต์ง ์์ ํ ๋งํ ๊ฐ ์์ผ๋ฉด ์ด step ์๋ฅผ returnํ๋ค.
ํ๋ฆฐ ์์ธ
์๊ฐ์ด๊ณผ. ๋งค step๋ง๋ค, ํ๋ฒ ๊ฒ์ฌํ ์ต์ ํ ๋งํ ๋ ๋ค์๋ฒ์ ๊ฒ์ฌํ์ง ์์๋ ๋จ (์ด๋ฏธ ์ธ์ ํ ๋งํ ๋ ๋ค ์ต์์ผ๋๊น)
๐ก Solution
์ฝ๋
import sys
input = sys.stdin.readline
from collections import deque
M, N, H = map(int, input().split())
#fill tomatos (-1: no tomato, 0: raw tomato, 1: grown tomato)
tmt = [[[0 for _ in range(M)] for _ in range(N)] for _ in range(H)]
for h in range(H):
for n in range(N):
tmt[h][n] = list(map(int, input().split()))
growns = deque([])
num_target = 0
for h in range(H):
for n in range(N):
for m in range(M):
if tmt[h][n][m] == 1:
growns.append((h, n, m))
elif tmt[h][n][m] == 0:
num_target += 1
dhs = [1, -1, 0, 0, 0, 0]
dns = [0, 0, 1, -1, 0, 0]
dms = [0, 0, 0, 0, 1, -1]
cnt = 0
while num_target > 0:
new_target = num_target
new_growns = deque([])
while growns:
vh, vn, vm = growns.popleft()
for dh, dn, dm in zip(dhs, dns, dms):
newh, newn, newm = vh+dh, vn+dn, vm+dm
if 0<=newh<H and 0<=newn<N and 0<=newm<M:
if tmt[newh][newn][newm] == 0:
tmt[newh][newn][newm] = 1
new_target -= 1
new_growns.append((newh, newn, newm))
if new_target == num_target:
cnt = -1
break
num_target = new_target
growns = new_growns
cnt += 1
print(cnt)
์ฝ๋ ์ค๋ช
- ์ต์ ํ ๋งํ ์ ๋ชฉ๋ก์ ์ฒ์์ ์ ์ฅํ๊ณ (
growns
), - ๋งค step๋ง๋ค ์ต์ ํ ๋งํ ์ ์ธ์ ํ ์ต์ง ์์ ํ ๋งํ ๋ค์ ์ตํ๋ค. ์ด ๋ ์๋กญ๊ฒ ์ต์ ํ ๋งํ ๋ค์ ๋ชฉ๋ก์ ์ ์ฅํ๋ค (
new_gronws
). - ์ฒ์์ ์ต์ง ์์ ํ ๋งํ ์ ๊ฐฏ์๋ฅผ countํ๊ณ (
num_target
), - ๋งค step์ด ๋๋ ๋ ์ต์ง ์์ ํ ๋งํ ์ ๊ฐฏ์๊ฐ ์ค์ง ์์์ผ๋ฉด (
if new_target == num_target
) ์งํ์ ๋ฉ์ถ๊ณ -1์ ๋ฐํ, (๋์ด์ ์งํํ ์ ์์) - ์ต์ง ์์ ํ ๋งํ ๊ฐ ์์ผ๋ฉด ์ด step ์๋ฅผ returnํ๋ค.
- ๋ค์ step์์๋ ์๋กญ๊ฒ ์ต์ ํ ๋งํ ๋ค์ ๋ชฉ๋ก์ ์ด์ฉํด ๋์ผํ๊ฒ ์งํํ๋ค.
'๐ CS > ์ฝ๋ฉํ ์คํธ' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[๋ฐฑ์ค 2579๋ฒ] ๊ณ๋จ ์ค๋ฅด๊ธฐ (python/ํ์ด์ฌ) (0) | 2022.09.15 |
---|---|
[๋ฐฑ์ค 14500๋ฒ] ํ ํธ๋ก๋ฏธ๋ ธ (python/ํ์ด์ฌ) (2) | 2022.09.14 |
[๋ฐฑ์ค 16926๋ฒ] ๋ฐฐ์ด ๋๋ฆฌ๊ธฐ 1 (python/ํ์ด์ฌ) (0) | 2022.07.05 |
[๋ฐฑ์ค 2504๋ฒ] ๊ดํธ์ ๊ฐ (python/ํ์ด์ฌ) (0) | 2022.07.01 |
[๋ฐฑ์ค 1697๋ฒ] ์จ๋ฐ๊ผญ์ง (python/ํ์ด์ฌ) (0) | 2022.06.30 |