728x90
문제
풀이
토마토 박스의 가로, 세로, 높이를 입력받는다.
입력받은 가로, 세로, 높이를 가진 토마토 박스 3차 배열을 만든다.
익은 토마토의 주변을 찾기 위한 queue를 정의한다.(가로, 세로, 높이를 가진 객체 queue)
입력값을 받아 토마토 박스에 넣는다.(0 - 안익은 토마토 / 1 - 익은 토마토 / -1 - 비어있음)
익은 토마토일 경우 queue에 해당 위치를 추가한다.
queue가 빌 때까지 반복하며 익은 토마토의 상, 하, 좌, 우, 위, 아래를 확인한다.
익지 않았을 경우 익은 토마토의 값에 1을 더하여 토마토 박스에 해당 위치를 입력하고 queue에 추가한다.
queue가 비었으면 토마토 박스를 확인하여 안 익은 토마토가 있다면 -1을 출력한다.
모두 익은 토마토인 경우 가장 큰 값에 -1을 빼서 출력한다.
정답 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
class PointXYZ{
int height;
int row;
int col;
public PointXYZ(int height, int row, int col){
this.height = height;
this.row = row;
this.col = col;
}
}
public class Main {
// 상, 하, 좌, 우, 위, 아래를 계산할 배열
static int rowArr[] = {-1, 0, 1, 0, 0, 0};
static int colArr[] = {0, 1, 0, -1, 0, 0};
static int heightArr[] = {0, 0, 0, 0, 1, -1};
static int[][][] box;
static int M;
static int N;
static int H;
static Queue<PointXYZ> queue = new LinkedList<>();
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
st = new StringTokenizer(br.readLine(), " ");
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
box = new int[H + 1][N + 1][M + 1];
for (int i = 1; i <= H; i++) {
for (int j = 1; j <= N; j++) {
st = new StringTokenizer(br.readLine());
for (int k = 1; k <= M; k++) {
box[i][j][k] = Integer.parseInt(st.nextToken());
// bfs를 시작하는 노드를 큐에 추가
if (box[i][j][k] == 1) queue.add(new PointXYZ(i, j, k));
}
}
}
System.out.println(bfs());
}
static int bfs() {
while (!queue.isEmpty()){
PointXYZ point = queue.poll();
int height = point.height;
int row = point.row;
int col = point.col;
for(int i = 0 ; i < 6; i++){
int moveHeight = height + heightArr[i];
int moveRow = row + rowArr[i];
int moveCol = col + colArr[i];
// 6방향으로 토마토가 익을 수 있는지 여부 확인
if(checkPoint(moveHeight, moveRow, moveCol)){
// 익은 토마토를 큐에 추가
queue.add(new PointXYZ(moveHeight, moveRow, moveCol));
// 익은 토마토의 값 = 이전에 익은 토마토의 값 + 1
box[moveHeight][moveRow][moveCol] = box[height][row][col] + 1;
}
}
}
// 최대 값을 구하기 위한 변수
int result = Integer.MIN_VALUE;
for(int i = 1; i <= H; i++){
for(int j = 1; j <= N; j++){
for(int k = 1; k <= M; k++){
// 하나라도 익지 않은 토마토가 있다면 -1을 반환
if(box[i][j][k] == 0) {
return -1;
}
// 토마토가 익는데 걸리는 시간을 구함
result = Math.max(result, box[i][j][k]);
}
}
}
// 최대 값이 1이라면 원래부터 모두 익어있었다는 것
if(result == 1) {
return 0;
// (최대 값 - 1) --> 걸린 일수
} else {
return (result - 1);
}
}
private static boolean checkPoint(int height, int row, int col){
// 주어진 범위 밖인지 검사
if(height < 1 || height > H || row < 1 || row > N || col < 1 || col > M) {
return false;
}
// 아직 익지 않은 토마토라면 true 반환
if(box[height][row][col] == 0) {
return true;
// 이미 익어있거나 빈 자리라면 false 반한
} else {
return false;
}
}
}
문의사항이나 피드백은 댓글로 남겨주세요.
'백준' 카테고리의 다른 글
[백준] 5014번: 스타트링크 - JAVA (0) | 2025.02.05 |
---|---|
[백준] 1697번: 숨바꼭질 - JAVA (0) | 2025.02.05 |
[백준] 2644번: 촌수계산 - JAVA (1) | 2025.02.05 |
[백준] 1012번: 유기농 배추 - JAVA (0) | 2025.02.05 |
[백준] 11050번: 이항 계수 1 - JAVA (1) | 2024.02.07 |