Problem Solving/[ํ•ญํ•ด99] TIL

99ํด๋Ÿฝ ์ฝ”ํ…Œ ์Šคํ„ฐ๋”” 12์ผ์ฐจ TIL / BFS(๋„ˆ๋น„ ์šฐ์„  ํƒ์ƒ‰)

geum 2024. 11. 8. 20:57

โœ๏ธ ๋ฌธ์ œ

https://www.acmicpc.net/problem/7569

 

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

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

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

 

๐Ÿค– ์ž…์ถœ๋ ฅ ์˜ˆ์‹œ

 

๐Ÿง ๋‚œ์ด๋„/์†Œ์š” ์‹œ๊ฐ„

โœ… ๋‚œ์ด๋„: solved.ac ๊ธฐ์ค€ G5

โœ… ์†Œ์š” ์‹œ๊ฐ„: 54๋ถ„

โœ… ๊ถŒ์žฅ ์‹œ๊ฐ„: 1์‹œ๊ฐ„ 15๋ถ„

 

๐Ÿ‘ฉ‍๐Ÿซ ์ฐธ๊ณ 

https://www.acmicpc.net/problem/7576

 

๐Ÿ’ก ํ’€์ด

1) ๋ฌธ์ œ ์œ ํ˜• ํŒŒ์•…

7576๋ฒˆ ํ† ๋งˆํ†  ๋ฌธ์ œ์— ์ธต์ˆ˜ ๊ฐœ๋…์ด ์ถ”๊ฐ€๋œ ๋ฌธ์ œ๋ผ 7576๋ฒˆ ๋ฌธ์ œ์™€ ๋™์ผํ•˜๊ฒŒ BFS๋กœ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

2) ์œ ์˜์‚ฌํ•ญ

์ผ๋ฐ˜์ ์ธ BFS ๋ฌธ์ œ ํ’€์ด์—์„œ ํฌ๊ฒŒ ๋ฒ—์–ด๋‚˜๋Š” ๊ฑด ์—†์—ˆ์ง€๋งŒ ๋ฐฐ์—ด ์ฐจ์›์ด ํ•˜๋‚˜ ๋Š˜๋‹ค ๋ณด๋‹ˆ๊นŒ ์‹ ๊ฒฝ ์จ์•ผ ํ•  ๋ถ€๋ถ„์ด ๋ช‡ ๊ฐœ ์žˆ์—ˆ๋‹ค.

 

โ‘  3์ฐจ์› ๋ฐฐ์—ด ์„ ์–ธ

2์ฐจ์› ์ด์ƒ์˜ ๋ฐฐ์—ด์„ ๋‹ค๋ฃจ๋Š” ๋ฐ ์•ฝํ•œ ํŽธ์ด๋ผ ์ž…๋ ฅ์œผ๋กœ ์ฃผ์–ด์ง€๋Š” ํ† ๋งˆํ†  ์ •๋ณด๋ฅผ ๋ฐ›์•„์„œ ๋ฐญ ์ „์ฒด๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‚ด์ง ํ—ท๊ฐˆ๋ ธ๋‹ค. ๋†’์ด๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ธ๋ฑ์Šค๊ฐ€ ๊ฐ€์žฅ ์•ž์— ์˜ค๊ธฐ ๋•Œ๋ฌธ์— farm[์ธต ์ธ๋ฑ์Šค][ํ–‰ ์ธ๋ฑ์Šค][์—ด ์ธ๋ฑ์Šค]๋กœ ์ ‘๊ทผํ•ด์•ผ ํ•จ!

 

โ‘ก ๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ๋‹ค ์ต์–ด์žˆ๋Š” ๊ฒฝ์šฐ ์ฒ˜๋ฆฌ

๋ชจ๋“  ํ† ๋งˆํ† ๊ฐ€ ์ด๋ฏธ ๋‹ค ์ต์€ ์ƒํƒœ๋ผ ์ตํž ํ•„์š”๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ 0์„ ์ถœ๋ ฅํ•ด์•ผ ํ•œ๋‹ค. ์ด ๋ถ€๋ถ„์„ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์•„๋ž˜์™€ ๊ฐ™์€ ๊ณผ์ •์„ ๊ฑฐ์ณค๋‹ค.

 

1๏ธโƒฃ ํ–‰ ๋‹จ์œ„๋กœ 0์ด ํฌํ•จ๋˜์–ด ์žˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  0์ด ํฌํ•จ๋˜์–ด ์žˆ์ง€ ์•Š์€ ํ–‰์ด๋ฉด all_ripe๋ผ๋Š” ๋ณ€์ˆ˜ ๊ฐ’+1

2๏ธโƒฃ all_ripe ๊ฐ’์ด ํ† ๋งˆํ†  ๋ฐญ์˜ ์ „์ฒด ํ–‰ ๊ฐœ์ˆ˜ N*H(ํ•œ ์ธต์— ํ–‰์ด N๊ฐœ์ด๊ธฐ ๋•Œ๋ฌธ)์™€ ๋™์ผํ•˜๋ฉด 0 ์ถœ๋ ฅ

 

โ‘ข ์ขŒํ‘œ ์ด๋™์šฉ ๋ฐฐ์—ด ์„ ์–ธ

2์ฐจ์› ๋ฐฐ์—ด์—์„œ BFS ๋ฌธ์ œ๋ฅผ ํ’€ ๋•Œ๋Š” ์ƒํ•˜์ขŒ์šฐ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๊ฒŒ dx, dy ๋ฐฐ์—ด์„ ์ •์˜ํ–ˆ๋Š”๋ฐ ์—ฌ๊ธฐ์„œ๋Š” dz ๋ฐฐ์—ด์„ ์ถ”๊ฐ€ํ•ด์„œ ์ธต์„ ์˜ฎ๊ฒจ ๋‹ค๋‹ˆ๋Š” ๊ฒƒ์„ ๊ตฌํ˜„ํ–ˆ๋‹ค.

 

์ด์™ธ์— ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๋ชจ๋‘ 7576๋ฒˆ๊ณผ ๋˜‘๊ฐ™์ด ์ฒ˜๋ฆฌํ•ด์คฌ๋‹ค.

 

3) ๊ตฌํ˜„

import sys

from collections import deque

input = sys.stdin.readline

M, N, H = map(int, input().split())

farm = []

for _ in range(H):
    tomato = []
    
    for _ in range(N):
        tomato.append(list(map(int, input().split())))
    
    farm.append(tomato)
    
all_ripe = 0

ripen_tomato = deque()

day = [[[0]*M for _ in range(N)] for _ in range(H)]

for h in range(0, len(farm)):
    for r in range(0, len(farm[h])):
        if 0 not in farm[h][r]:
            all_ripe += 1
        
        for c in range(0, len(farm[h][r])):
            if farm[h][r][c] == 1:
                ripen_tomato.append((h, r, c))
            elif farm[h][r][c] == -1:
                day[h][r][c] = -1

if all_ripe == N*H:
    print(0)
else:
    dx = [1, -1, 0, 0, 0, 0]  # x์ถ• -> ์˜ค๋ฅธ์ชฝ, ์™ผ์ชฝ
    dy = [0, 0, 1, -1, 0, 0]  # y์ถ• -> ์•„๋ž˜, ์œ„
    dz = [0, 0, 0, 0, 1, -1]  # z์ถ• -> ์•ž, ๋’ค
        
    while ripen_tomato:
        h, r, c = ripen_tomato.popleft()
        
        for i in range(6):
            new_h, new_r, new_c = h+dz[i], r+dx[i], c+dy[i]
            
            if (0 <= new_h < H and 0 <= new_r < N and 0 <= new_c < M) and farm[new_h][new_r][new_c] == 0:
                farm[new_h][new_r][new_c] = farm[h][r][c]+1
                
                ripen_tomato.append((new_h, new_r, new_c))

    day = 0

    for height in farm:
        for row in height:
            if 0 in row:
                print(-1)
                exit()

            day = max(day, max(row))

    print(day-1)

 

4) ์–ด๋ ค์› ๋˜ ์ /๋ฐฐ์šด ์ 

๐Ÿšจ ์–ด๋ ค์› ๋˜ ์ 

  • 3์ฐจ์› ๋ฐฐ์—ด ๋‹ค๋ฃจ๊ธฐ โญ ์—ฐ์Šต์žฅ์— ๋ฐฐ์—ด ๊ทธ๋ฆผ ๊ทธ๋ฆฌ๊ณ  ์†์œผ๋กœ ์จ๊ฐ€๋ฉด์„œ ํ’€์—ˆ๋‹ค..^^

โ— ๋ฐฐ์šด ์ 

  • 2์ฐจ์› ์ด์ƒ์˜ ๋ฐฐ์—ด ์š”์†Œ์— ์ ‘๊ทผํ•  ๋•Œ๋Š” ์ถ”๊ฐ€๋œ ์ฐจ์›์„ ์ œ์ผ ์•ž์œผ๋กœ ๋ณด๋‚ด์„œ ์ƒ๊ฐํ•˜๋ฉด ๋œ๋‹ค.