[BOJ] 7569번 - ν† λ§ˆν† πŸ…

κΉ€μœ μ§„Β·2023λ…„ 3μ›” 2일
0

PS

λͺ©λ‘ 보기
18/36

문제 링크

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

문제 μœ ν˜•

κ·Έλž˜ν”„ (BFS)

🌈문제

철수의 ν† λ§ˆν†  농μž₯μ—μ„œλŠ” ν† λ§ˆν† λ₯Ό λ³΄κ΄€ν•˜λŠ” 큰 μ°½κ³ λ₯Ό 가지고 μžˆλ‹€. ν† λ§ˆν† λŠ” μ•„λž˜μ˜ κ·Έλ¦Όκ³Ό 같이 격자λͺ¨μ–‘ μƒμžμ˜ 칸에 ν•˜λ‚˜μ”© 넣은 λ‹€μŒ, μƒμžλ“€μ„ 수직으둜 μŒ“μ•„ μ˜¬λ €μ„œ 창고에 λ³΄κ΄€ν•œλ‹€.

창고에 λ³΄κ΄€λ˜λŠ” ν† λ§ˆν† λ“€ μ€‘μ—λŠ” 잘 읡은 것도 μžˆμ§€λ§Œ, 아직 읡지 μ•Šμ€ ν† λ§ˆν† λ“€λ„ μžˆμ„ 수 μžˆλ‹€. 보관 ν›„ ν•˜λ£¨κ°€ μ§€λ‚˜λ©΄, 읡은 ν† λ§ˆν† λ“€μ˜ μΈμ ‘ν•œ 곳에 μžˆλŠ” 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ€ 읡은 ν† λ§ˆν† μ˜ 영ν–₯을 λ°›μ•„ 읡게 λœλ‹€. ν•˜λ‚˜μ˜ ν† λ§ˆν† μ— μΈμ ‘ν•œ 곳은 μœ„, μ•„λž˜, μ™Όμͺ½, 였λ₯Έμͺ½, μ•ž, λ’€ μ—¬μ„― λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ₯Ό μ˜λ―Έν•œλ‹€. λŒ€κ°μ„  λ°©ν–₯에 μžˆλŠ” ν† λ§ˆν† λ“€μ—κ²ŒλŠ” 영ν–₯을 주지 λͺ»ν•˜λ©°, ν† λ§ˆν† κ°€ 혼자 μ €μ ˆλ‘œ μ΅λŠ” κ²½μš°λŠ” μ—†λ‹€κ³  κ°€μ •ν•œλ‹€. μ² μˆ˜λŠ” 창고에 λ³΄κ΄€λœ ν† λ§ˆν† λ“€μ΄ 며칠이 μ§€λ‚˜λ©΄ λ‹€ 읡게 λ˜λŠ”μ§€ κ·Έ μ΅œμ†Œ 일수λ₯Ό μ•Œκ³  μ‹Άμ–΄ ν•œλ‹€.
ν† λ§ˆν† λ₯Ό 창고에 λ³΄κ΄€ν•˜λŠ” 격자λͺ¨μ–‘μ˜ μƒμžλ“€μ˜ 크기와 읡은 ν† λ§ˆν† λ“€κ³Ό 읡지 μ•Šμ€ ν† λ§ˆν† λ“€μ˜ 정보가 μ£Όμ–΄μ‘Œμ„ λ•Œ, 며칠이 μ§€λ‚˜λ©΄ ν† λ§ˆν† λ“€μ΄ λͺ¨λ‘ μ΅λŠ”μ§€, κ·Έ μ΅œμ†Œ 일수λ₯Ό κ΅¬ν•˜λŠ” ν”„λ‘œκ·Έλž¨μ„ μž‘μ„±ν•˜λΌ. 단, μƒμžμ˜ 일뢀 μΉΈμ—λŠ” ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ„ μˆ˜λ„ μžˆλ‹€.

μž…λ ₯

첫 μ€„μ—λŠ” μƒμžμ˜ 크기λ₯Ό λ‚˜νƒ€λ‚΄λŠ” 두 μ •μˆ˜ M,Nκ³Ό μŒ“μ•„μ˜¬λ €μ§€λŠ” μƒμžμ˜ 수λ₯Ό λ‚˜νƒ€λ‚΄λŠ” Hκ°€ 주어진닀. M은 μƒμžμ˜ κ°€λ‘œ 칸의 수, N은 μƒμžμ˜ μ„Έλ‘œ 칸의 수λ₯Ό λ‚˜νƒ€λ‚Έλ‹€. 단, 2 ≀ M ≀ 100, 2 ≀ N ≀ 100, 1 ≀ H ≀ 100 이닀. λ‘˜μ§Έ μ€„λΆ€ν„°λŠ” κ°€μž₯ λ°‘μ˜ μƒμžλΆ€ν„° κ°€μž₯ μœ„μ˜ μƒμžκΉŒμ§€μ— μ €μž₯된 ν† λ§ˆν† λ“€μ˜ 정보가 주어진닀. 즉, λ‘˜μ§Έ 쀄뢀터 N개의 μ€„μ—λŠ” ν•˜λ‚˜μ˜ μƒμžμ— λ‹΄κΈ΄ ν† λ§ˆν† μ˜ 정보가 주어진닀. 각 μ€„μ—λŠ” μƒμž κ°€λ‘œμ€„μ— λ“€μ–΄μžˆλŠ” ν† λ§ˆν† λ“€μ˜ μƒνƒœκ°€ M개의 μ •μˆ˜λ‘œ 주어진닀. μ •μˆ˜ 1은 읡은 ν† λ§ˆν† , μ •μˆ˜ 0 은 읡지 μ•Šμ€ ν† λ§ˆν† , μ •μˆ˜ -1은 ν† λ§ˆν† κ°€ λ“€μ–΄μžˆμ§€ μ•Šμ€ 칸을 λ‚˜νƒ€λ‚Έλ‹€. μ΄λŸ¬ν•œ N개의 쀄이 H번 λ°˜λ³΅ν•˜μ—¬ 주어진닀.

ν† λ§ˆν† κ°€ ν•˜λ‚˜ 이상 μžˆλŠ” 경우만 μž…λ ₯으둜 주어진닀.

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

좜λ ₯

μ—¬λŸ¬λΆ„μ€ ν† λ§ˆν† κ°€ λͺ¨λ‘ 읡을 λ•ŒκΉŒμ§€ μ΅œμ†Œ 며칠이 κ±Έλ¦¬λŠ”μ§€λ₯Ό κ³„μ‚°ν•΄μ„œ 좜λ ₯ν•΄μ•Ό ν•œλ‹€. λ§Œμ•½, μ €μž₯될 λ•ŒλΆ€ν„° λͺ¨λ“  ν† λ§ˆν† κ°€ μ΅μ–΄μžˆλŠ” μƒνƒœμ΄λ©΄ 0을 좜λ ₯ν•΄μ•Ό ν•˜κ³ , ν† λ§ˆν† κ°€ λͺ¨λ‘ μ΅μ§€λŠ” λͺ»ν•˜λŠ” 상황이면 -1을 좜λ ₯ν•΄μ•Ό ν•œλ‹€.

4

πŸ’‘ 아이디어

μ²˜μŒμ— μ΅œμ†Ÿκ°’μ„ κ΅¬ν•˜λŠ” κ²ƒμ΄λ―€λ‘œ BFS + μ΅œλ‹¨κ±°λ¦¬ κ°œλ…μΈκ²ƒμ€ μ•Œμ•„μ±˜λ‹€.
κ·ΈλŸ¬λ‚˜.. 문제λ₯Ό 잘λͺ» μ΄ν•΄ν•˜λŠ” λ°”λžŒμ— μ΅œμ†Œ 2μ‹œκ°„μ„ λ‚ λ¦° λ¬Έμ œμ΄λ‹€.
μ²˜μŒμ—λŠ” μž…λ ₯값이 5 3 2인데 μ™œ 6μ€„μ΄λ‚˜ λ“€μ–΄μ˜€μ§€? ν•˜κ³  ν•œμ°Έ λ™μ•ˆ μ΄ν•΄ν•˜μ§€ λͺ»ν•΄μ„œ ν—€λ©¨μ—ˆλŠ”λ°, μ•Œκ³  λ³΄λ‹ˆκΉŒ λͺ¨λ“  판의 정보가 ν•œλ²ˆμ— λ“€μ–΄μ™€μ„œ λ‚΄κ°€ λͺ»μ•Œμ•„μ±˜λ˜ κ²ƒμ΄μ—ˆλ‹€.

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

μš”κ²Œ κ·Έ μœ„μ— κΉ”λ¦° 판인 것이닀.
각 νŒλ§ˆλ‹€μ˜ 정보λ₯Ό λ°›κ³  있고, 3차원 μƒμ˜ λ¬Έμ œμ΄λ‹ˆκΉŒ 3차원 배열을 두고 ν’€μ–΄μ•Ό ν•œλ‹€. μ§€κΈˆκΉŒμ§€ 2차원 λ°°μ—΄ μ½”λ“œλ₯Ό μ„Έμ›Œλ†“κ³  μ™„μ „ μ‚½μ§ˆμ„ ν•˜κ³  μžˆμ—ˆλ˜ 것..! γ… γ… 
3차원 BFSλŠ” 처음 풀어보기 λ•Œλ¬Έμ— κΈ΄μž₯ν–ˆμ§€λ§Œ 잘 ν’€μ–΄λ³΄μž.

πŸ‘¨β€πŸ’» μ½”λ“œ μž‘μ„±

from collections import deque
Q = deque()
M, N, H = map(int,input().split())
arr = [[1, 0, 0], [-1, 0, 0],[0, 1, 0],[0, -1, 0],[0, 0, 1],[0, 0, -1]]
tomato = [[] for i in range(H)]
day = 0
for a in range(H):
    for _ in range(N):
        tomato[a].append(list(map(int,input().split())))

for i in range(H):
    for j in range(N):
        for z in range(M):
            if tomato[i][j][z] == 1:
                Q.append([i, j, z])

while (len(Q) > 0):
    poped = Q.popleft()
    z = poped[0]
    y = poped[1]
    x = poped[2]
    for i in range(6):
        Z = z + arr[i][0]
        Y = y + arr[i][1]
        X = x + arr[i][2]

        if X < 0 or Y < 0 or X >= M or Y >= N or Z < 0 or Z >= H:
            continue
        if tomato[Z][Y][X] == 0:
            tomato[Z][Y][X] = tomato[z][y][x] + 1
            Q.append([Z, Y, X])

for i in range(H):
    for j in range(N):
        for z in range(M):
            day = max(day, tomato[i][j][z])
            if tomato[i][j][z] == 0:
                print(-1)
                exit()
print(day - 1)

3μ°¨μ›μ˜ κ³ λΉ„λ§Œ λ„˜κΈ°λ©΄ λ‚˜λ¨Έμ§€ μ½”λ“œλŠ” BFS의 μ „ν˜•μ μΈ μœ ν˜•μ΄λ‹ˆ μ–΄λ ΅μ§€λŠ” μ•Šλ‹€.
3차원 배열을 λ§Œλ“€μ–΄ μ£Όκ³ , 3차원 정보λ₯Ό μ œλŒ€λ‘œ μž…λ ₯ν•΄ λ„£λŠ”λ‹€.
이후 3차원 순회λ₯Ό λŒλ©΄μ„œ 읡은 μΉœκ΅¬λ“€μ„ Q에 넣어놓고, ν•˜λ‚˜μ”© κΊΌλ‚΄λ©΄μ„œ 읡은 μΉœκ΅¬λ“€κ³Ό μΈμ ‘ν•œ 상,ν•˜,쒌,우 μΉœκ΅¬λ“€μ— λŒ€ν•΄μ„œ 읡은 λ‚ μ§œλ₯Ό 직접 λ„£μ–΄μ£Όμ–΄μ„œ λ°©λ¬Έν•œ κ³³μ΄λΌλŠ” 곳을 ν‘œν˜„ν•œλ‹€.

이후, κ°€μž₯ 큰 값을 μ°Ύμ•„μ„œ day에 λ„£κ³ , 읡은 ν† λ§ˆν†  1λΆ€ν„° μ‹œμž‘ν–ˆμœΌλ‹ˆκΉŒ λ§ˆμ§€λ§‰μ— λ§ˆμ΄λ„ˆμŠ€ 1을 ν•΄μ€€λ‹€. λ§Œμ•½ μ•ˆμ΅μ€ ν† λ§ˆν†  0이 μ‘΄μž¬ν•œλ‹€λ©΄ λͺ¨λ‘ μ΅λŠ” 방법이 μ‘΄μž¬ν•˜μ§€ μ•ŠλŠ” κ²ƒμ΄λ‹ˆκΉŒ -1을 좜λ ₯ν•œλ‹€.

0개의 λŒ“κΈ€