[BOJ][๐ŸŸก5][๋ฐฑ์ค€#07569] ํ† ๋งˆํ† 

์ž‘์„ฑ:    

์—…๋ฐ์ดํŠธ:

์นดํ…Œ๊ณ ๋ฆฌ:

ํƒœ๊ทธ: , , ,

๋ฌธ์ œ ์ถœ์ฒ˜

BAEKJOON Online Judge #7569


๋ฌธ์ œ

์ฒ ์ˆ˜์˜ ํ† ๋งˆํ†  ๋†์žฅ์—์„œ๋Š” ํ† ๋งˆํ† ๋ฅผ ๋ณด๊ด€ํ•˜๋Š” ํฐ ์ฐฝ๊ณ ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค. ํ† ๋งˆํ† ๋Š” ์•„๋ž˜์˜ ๊ทธ๋ฆผ๊ณผ ๊ฐ™์ด ๊ฒฉ์ž๋ชจ์–‘ ์ƒ์ž์˜ ์นธ์— ํ•˜๋‚˜์”ฉ ๋„ฃ์€ ๋‹ค์Œ, ์ƒ์ž๋“ค์„ ์ˆ˜์ง์œผ๋กœ ์Œ“์•„ ์˜ฌ๋ ค์„œ ์ฐฝ๊ณ ์— ๋ณด๊ด€ํ•œ๋‹ค.

์ฐฝ๊ณ ์— ๋ณด๊ด€๋˜๋Š” ํ† ๋งˆํ† ๋“ค ์ค‘์—๋Š” ์ž˜ ์ต์€ ๊ฒƒ๋„ ์žˆ์ง€๋งŒ, ์•„์ง ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋“ค๋„ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค. ๋ณด๊ด€ ํ›„ ํ•˜๋ฃจ๊ฐ€ ์ง€๋‚˜๋ฉด, ์ต์€ ํ† ๋งˆํ† ๋“ค์˜ ์ธ์ ‘ํ•œ ๊ณณ์— ์žˆ๋Š” ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋“ค์€ ์ต์€ ํ† ๋งˆํ† ์˜ ์˜ํ–ฅ์„ ๋ฐ›์•„ ์ต๊ฒŒ ๋œ๋‹ค. ํ•˜๋‚˜์˜ ํ† ๋งˆํ† ์— ์ธ์ ‘ํ•œ ๊ณณ์€ ์œ„, ์•„๋ž˜, ์™ผ์ชฝ, ์˜ค๋ฅธ์ชฝ, ์•ž, ๋’ค ์—ฌ์„ฏ ๋ฐฉํ–ฅ์— ์žˆ๋Š” ํ† ๋งˆํ† ๋ฅผ ์˜๋ฏธํ•œ๋‹ค. ๋Œ€๊ฐ์„  ๋ฐฉํ–ฅ์— ์žˆ๋Š” ํ† ๋งˆํ† ๋“ค์—๊ฒŒ๋Š” ์˜ํ–ฅ์„ ์ฃผ์ง€ ๋ชปํ•˜๋ฉฐ, ํ† ๋งˆํ† ๊ฐ€ ํ˜ผ์ž ์ €์ ˆ๋กœ ์ต๋Š” ๊ฒฝ์šฐ๋Š” ์—†๋‹ค๊ณ  ๊ฐ€์ •ํ•œ๋‹ค. ์ฒ ์ˆ˜๋Š” ์ฐฝ๊ณ ์— ๋ณด๊ด€๋œ ํ† ๋งˆํ† ๋“ค์ด ๋ฉฐ์น ์ด ์ง€๋‚˜๋ฉด ๋‹ค ์ต๊ฒŒ ๋˜๋Š”์ง€ ๊ทธ ์ตœ์†Œ ์ผ์ˆ˜๋ฅผ ์•Œ๊ณ  ์‹ถ์–ด ํ•œ๋‹ค. ํ† ๋งˆํ† ๋ฅผ ์ฐฝ๊ณ ์— ๋ณด๊ด€ํ•˜๋Š” ๊ฒฉ์ž๋ชจ์–‘์˜ ์ƒ์ž๋“ค์˜ ํฌ๊ธฐ์™€ ์ต์€ ํ† ๋งˆํ† ๋“ค๊ณผ ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† ๋“ค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์กŒ์„ ๋•Œ, ๋ฉฐ์น ์ด ์ง€๋‚˜๋ฉด ํ† ๋งˆํ† ๋“ค์ด ๋ชจ๋‘ ์ต๋Š”์ง€, ๊ทธ ์ตœ์†Œ ์ผ์ˆ˜๋ฅผ ๊ตฌํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๋ผ. ๋‹จ, ์ƒ์ž์˜ ์ผ๋ถ€ ์นธ์—๋Š” ํ† ๋งˆํ† ๊ฐ€ ๋“ค์–ด์žˆ์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋‹ค.


์ž…๋ ฅ

์ฒซ ์ค„์—๋Š” ์ƒ์ž์˜ ํฌ๊ธฐ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๋‘ ์ •์ˆ˜ M,N๊ณผ ์Œ“์•„์˜ฌ๋ ค์ง€๋Š” ์ƒ์ž์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” H๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. M์€ ์ƒ์ž์˜ ๊ฐ€๋กœ ์นธ์˜ ์ˆ˜, N์€ ์ƒ์ž์˜ ์„ธ๋กœ ์นธ์˜ ์ˆ˜๋ฅผ ๋‚˜ํƒ€๋‚ธ๋‹ค. ๋‹จ, 2 โ‰ค M โ‰ค 100, 2 โ‰ค N โ‰ค 100, 1 โ‰ค H โ‰ค 100 ์ด๋‹ค. ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ๋Š” ๊ฐ€์žฅ ๋ฐ‘์˜ ์ƒ์ž๋ถ€ํ„ฐ ๊ฐ€์žฅ ์œ„์˜ ์ƒ์ž๊นŒ์ง€์— ์ €์žฅ๋œ ํ† ๋งˆํ† ๋“ค์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ์ฆ‰, ๋‘˜์งธ ์ค„๋ถ€ํ„ฐ N๊ฐœ์˜ ์ค„์—๋Š” ํ•˜๋‚˜์˜ ์ƒ์ž์— ๋‹ด๊ธด ํ† ๋งˆํ† ์˜ ์ •๋ณด๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๊ฐ ์ค„์—๋Š” ์ƒ์ž ๊ฐ€๋กœ์ค„์— ๋“ค์–ด์žˆ๋Š” ํ† ๋งˆํ† ๋“ค์˜ ์ƒํƒœ๊ฐ€ M๊ฐœ์˜ ์ •์ˆ˜๋กœ ์ฃผ์–ด์ง„๋‹ค. ์ •์ˆ˜ 1์€ ์ต์€ ํ† ๋งˆํ† , ์ •์ˆ˜ 0 ์€ ์ต์ง€ ์•Š์€ ํ† ๋งˆํ† , ์ •์ˆ˜ -1์€ ํ† ๋งˆํ† ๊ฐ€ ๋“ค์–ด์žˆ์ง€ ์•Š์€ ์นธ์„ ๋‚˜ํƒ€๋‚ธ๋‹ค. ์ด๋Ÿฌํ•œ N๊ฐœ์˜ ์ค„์ด H๋ฒˆ ๋ฐ˜๋ณตํ•˜์—ฌ ์ฃผ์–ด์ง„๋‹ค. ํ† ๋งˆํ† ๊ฐ€ ํ•˜๋‚˜ ์ด์ƒ ์žˆ๋Š” ๊ฒฝ์šฐ๋งŒ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง„๋‹ค.


์ถœ๋ ฅ

์—ฌ๋Ÿฌ๋ถ„์€ ํ† ๋งˆํ† ๊ฐ€ ๋ชจ๋‘ ์ต์„ ๋•Œ๊นŒ์ง€ ์ตœ์†Œ ๋ฉฐ์น ์ด ๊ฑธ๋ฆฌ๋Š”์ง€๋ฅผ ๊ณ„์‚ฐํ•ด์„œ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ๋งŒ์•ฝ, ์ €์žฅ๋  ๋•Œ๋ถ€ํ„ฐ ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ต์–ด์žˆ๋Š” ์ƒํƒœ์ด๋ฉด 0์„ ์ถœ๋ ฅํ•ด์•ผ ํ•˜๊ณ , ํ† ๋งˆํ† ๊ฐ€ ๋ชจ๋‘ ์ต์ง€๋Š” ๋ชปํ•˜๋Š” ์ƒํ™ฉ์ด๋ฉด -1์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค.


์˜ˆ์ œ

์˜ˆ์ œ 1

์ž…๋ ฅ

5 3 1
0 -1 0 0 0
-1 -1 0 1 1
0 0 0 1 1


์ถœ๋ ฅ

-1


์˜ˆ์ œ 2

์ž…๋ ฅ

5 3 2
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 0 0 0
0 0 1 0 0
0 0 0 0 0


์ถœ๋ ฅ

4


์˜ˆ์ œ 3

์ž…๋ ฅ

4 3 2
1 1 1 1
1 1 1 1
1 1 1 1
1 1 1 1
-1 -1 -1 -1
1 1 1 -1


์ถœ๋ ฅ

0


My Sol

import sys
input = sys.stdin.readline

# ํ•˜๋‚˜๋ผ๋„ 0์ด ์žˆ์œผ๋ฉด True, ์•„๋‹ˆ๋ฉด False
def checkZero():
    global cube, H, I, J
    for h in range(H):
        for i in range(I):
            for j in range(J):
                if not cube[h][i][j]:
                    return 1
    return 0


# ์ž…๋ ฅ ์ฒ˜๋ฆฌ
J, I, H = map(int, input().split())
cube = []
for _ in range(H):
    mat = [list(map(int, input().split())) for _ in range(I)]
    cube.append(mat)

# ์ €์žฅ๋  ๋•Œ๋ถ€ํ„ฐ ๋ชจ๋‘ ์ต์œผ๋ฉด(0์ด ์—†์œผ๋ฉด) 0 ์ถœ๋ ฅ
if not checkZero():
    print(0)
    quit()

# 1์˜ ์ขŒํ‘œ๋ฅผ Q์— ์‚ฝ์ž…
Q = []
front, back = -1, 0
for h in range(H):
    for i in range(I):
        for j in range(J):
            if cube[h][i][j]==1:
                Q.append((0, h, i, j))
                back += 1


# ์ˆ™์„ฑ ์‹œ์ž‘
max_day = 0
while front < back-1:
    front += 1
    nday, nh, ni, nj = Q[front]

    dhij = [(0,-1,0), (0,1,0), (0,0,-1), (0,0,1), (1,0,0), (-1,0,0)]
    for dh, di, dj in dhij:
        # ํƒ์ƒ‰ ๋ฐฉํ–ฅ์ด ์ƒ์ž ๋ฒ”์œ„ ์ด๋‚ด์ด๊ณ 
        if (0<=nh+dh<H) and (0<=ni+di<I) and (0<=nj+dj<J):
            # ์•ˆ ์ต์€ ํ† ๋งˆํ† ๋ผ๋ฉด
            if not cube[nh+dh][ni+di][nj+dj]:
                # cube์— ํƒ์ƒ‰ ์œ„์น˜๋ฅผ ์ฒดํฌ
                cube[nh+dh][ni+di][nj+dj] = 1
                # Q์— ํƒ์ƒ‰ ์ขŒํ‘œ์™€ ์ผ์ˆ˜๋ฅผ ์ถ”๊ฐ€
                Q.append((nday+1, nh+dh, ni+di, nj+dj))
                back += 1

                if max_day < nday+1:
                    max_day = nday+1

# ์ˆ™์„ฑ ๋ชจ๋‘ ๋งˆ์น˜๊ณ  ์•ˆ ์ต์€ ํ† ๋งˆํ† ๊ฐ€ ์žˆ๋‹ค๋ฉด -1 ์ถœ๋ ฅ, ์•„๋‹ˆ๋ผ๋ฉด max_day ์ถœ๋ ฅ
print(-1 if checkZero() else max_day)

BFS๋ฅผ ์ด์šฉํ•˜๋Š” ๋ฌธ์ œ์˜€๊ณ , ์ฒ˜์Œ์œผ๋กœ 3์ฐจ์› ๋ฐฉ์‹์œผ๋กœ ํ’€์–ด๋ณด๋Š” ๋ฌธ์ œ์˜€๋‹ค. ์ฐจ์›์ด ํ‰๋ฉด์—์„œ ์ž…์ฒด๊ฐ€ ๋˜์—ˆ์„ ๋ฟ, ๋ฒกํ„ฐ๋ฅผ ๋‹ค๋ฃจ๋Š” ๋ฐฉ์‹์ด๋‚˜ ์ž…๋ ฅ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ์‹์€ ๊ธฐ์กด๊ณผ ๋น„์Šทํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜คํžˆ๋ ค ์–ด๋ ต์ง€ ์•Š๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋Š” ๋ฌธ์ œ์˜€๋‹ค.


์ฒ˜์Œ๋ถ€ํ„ฐ ์•ˆ ์ต์€ ํ† ๋งˆํ† ๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ : ์™„์ „ ํƒ์ƒ‰

์ฒ˜์Œ๋ถ€ํ„ฐ ์•ˆ ์ต์€ ํ† ๋งˆํ† , ์ฆ‰ 0์ด ์—†๋Š” ๊ฒฝ์šฐ๋ฅผ ํŒ๋ณ„ํ•˜๊ธฐ ์œ„ํ•ด checkZero() ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜์˜€๋‹ค. cube์˜ ๋ชจ๋“  ์นธ์„ ๋Œ๋ฉฐ ๊ฐ’์ด 0, ์ฆ‰ False์ธ ๊ฒฝ์šฐ๋ฅผ ๋งˆ์ฃผ์นœ๋‹ค๋ฉด ์ฆ‰์‹œ 1์„ ๋ฐ˜ํ™˜ํ•˜๊ณ , ๋๊นŒ์ง€ ํƒ์ƒ‰ํ–ˆ๋Š”๋ฐ๋„ 0์„ ๋ฐœ๊ฒฌํ•˜์ง€ ๋ชปํ–ˆ๋‹ค๋ฉด 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ๋งŒ์•ฝ checkZero๊ฐ€ 0์„ ๋ฐ˜ํ™˜ํ•œ๋‹ค๋ฉด ์ฒ˜์Œ๋ถ€ํ„ฐ ์ตํž ํ† ๋งˆํ† ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— 0์„ ์ถœ๋ ฅํ•˜๊ณ  ๋๋‚ธ๋‹ค.


์ˆ™์„ฑ ๊ณผ์ • : BFS

๊ธฐ์กด delta๋ฅผ ๊ฐ€๋กœ, ์„ธ๋กœ์— ๋Œ€ํ•ด์„œ๋งŒ ์ •์˜ํ–ˆ๋‹ค๋ฉด, 3์ฐจ์›์„ ๋„์ž…ํ•ด ์œ„ ์•„๋ž˜ ์ธต์˜ ๊ฐ’๊นŒ์ง€ ํ™•์ธํ•˜๋ฉด ๋˜๊ฒ ๋‹ค. ๋˜‘๊ฐ™์ด ๋ฒ”์œ„ ๋‚ด์ธ์ง€ ํ™•์ธํ•˜๊ณ  ๊ฐ’์ด 0์ด๋ผ๋ฉด ์ฒดํฌํ•˜๊ณ  Queue์— ๋„ฃ์–ด์ฃผ๋Š” ๊ฒƒ์ด๋‹ค.


๊ฒฐ๊ณผ

๋งž์•˜์Šต๋‹ˆ๋‹ค!!

๋Œ“๊ธ€๋‚จ๊ธฐ๊ธฐ