마음만 바쁜 사람
Published 2022. 6. 1. 08:38
7569-토마토 ALGORITHM/BOJ

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

 

7569번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,

www.acmicpc.net

기본적인 BFS문제. 이전에도 풀어보았지만 코딩테스트 전 점검을 위해 다시 한번 풀어보았다. 확실히 이전보다는 수월하게 해결하였지만 토마토가 하나도 없을 때, 익을 수 있는 토마토가 존재하지 않을 때의 예외 처리 순서가 잘못돼 70~80 퍼센트 대에서 오답이 나왔다. 틀릴만한 부분이 예외처리 밖에 없어서 어렵지 않게 찾을 수 있었지만 코테에서는 한번 말리면 시간을 꽤나 잡아먹을것 같은 느낌.. 

 

최근 여러 기업들의 인턴 공고에 지원하여 코테를 보고 있다. 6월 1일 기준으로 한달동안 6군데 정도 본 것 같은데, 어느정도 기준치 이상 풀었다고 생각해도 탈락 통보가 오는 곳이 있었다. 물론 서류와 함께 심사하는 전형이라 종합적인 문제가 있겠지만 풀었다고 생각했던 문제 중 히든테케를 충족하지 못해 코테에서 좋은 점수를 받지 못한건 아닐까 하는 생각도 있다. 아무리 쉬운 문제라도 다시 한번 확인해 보고 내가 놓친 경우가 있는지 확인해 보는 습관을 가지면 좋을것 같다. (시간이 남는다면..)

 

import sys
sys.stdin = open('input.txt', 'r')

from collections import deque

M, N, H = map(int,input().split())
board = [[list(map(int,input().split())) for _ in range(N)] for _ in range(H)]

dx = (0, 0, 1, 0, 0, -1)
dy = (0, 1, 0, 0, -1, 0)
dz = (1, 0, 0, -1, 0, 0)

def is_possible(x, y, z):
    return 0 <= x < M and 0 <= y < N and 0 <= z < H
day = 0
dq = deque()
for z in range(H):
    for y in range(N):
        for x in range(M):
            if board[z][y][x] == 1:
                dq.append((z,y,x, day))
ans = 0

while dq:
    z, y, x, day = dq.popleft()
    for i in range(6):
        nz, ny, nx = z + dz[i], y + dy[i], x + dx[i]
        if is_possible(nx,ny,nz) and board[nz][ny][nx] == 0:
            board[nz][ny][nx] = day + 1
            ans = max(ans, day + 1)
            dq.append((nz,ny,nx, day+1))



for z in range(H):
    for y in range(N):
        for x in range(M):
            if board[z][y][x] == 0:
                ans = -1
if ans == 0:
    print(0)
else:    
    print(ans)

'ALGORITHM > BOJ' 카테고리의 다른 글

11989- 수 정렬하기  (0) 2022.06.14
11403-경로 찾기  (0) 2022.06.02
7453-합이 0인 네 정수  (0) 2022.05.04
2110-공유기  (0) 2022.05.03
11663-선분 위의 점  (0) 2022.05.03
profile

마음만 바쁜 사람

@훌루훌루

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!