๐Ÿ”‘ CS/์ฝ”๋”ฉํ…Œ์ŠคํŠธ

[๋ฐฑ์ค€ 7569๋ฒˆ] ํ† ๋งˆํ†  (python/ํŒŒ์ด์ฌ)

๋ณต๋งŒ 2022. 9. 9. 15:29

๋ถ„๋…ธ์˜ ํ† ๋งˆํ† ...๐Ÿ…

์ ‘๊ทผ๋ฐฉ๋ฒ•์ด ํ‹€๋ ค์„œ ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ๋ช‡๋ฒˆ์”ฉ ์ˆ˜์ •ํ–ˆ๋‹ค

 

๐ŸŒผ ๋ฌธ์ œ ๋งํฌ

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์—์„œ๋Š” ์ƒˆ๋กญ๊ฒŒ ์ต์€ ํ† ๋งˆํ† ๋“ค์˜ ๋ชฉ๋ก์„ ์ด์šฉํ•ด ๋™์ผํ•˜๊ฒŒ ์ง„ํ–‰ํ•œ๋‹ค.
  •  
๋ฐ˜์‘ํ˜•