티스토리 뷰
반응형
문제
https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
풀이 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int[] dh = {1, 0, 0, -1, 0, 0};
static int[] dy = {0, 1, 0, 0, -1, 0};
static int[] dx = {0, 0, 1, 0, 0, -1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int M = Integer.parseInt(st.nextToken()); //상자 가로
int N = Integer.parseInt(st.nextToken()); //상자 세로
int H = Integer.parseInt(st.nextToken()); //상자 개수
int[][][] box = new int[H][N][M]; //토마토 상자
int[][][] visit = new int[H][N][M]; //방문 표시
for (int i = 0; i < H; i++) {
for (int j = 0; j < N; j++) {
st = new StringTokenizer(br.readLine());
for (int k = 0; k < M; k++) {
box[i][j][k] = Integer.parseInt(st.nextToken());
}
}
}
Queue<int[]> queue = new LinkedList<>();
for (int i = 0; i < H; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < M; k++) {
//익은 사과가 있으면, 큐에 담고 방문 표시를 한다.
if (box[i][j][k] == 1) {
queue.offer(new int[]{i, j, k});
visit[i][j][k] = 1;
}
}
}
}
while (!queue.isEmpty()) {
int size = queue.size();
for (int l = 0; l < size; l++) {
int[] curPoint = queue.poll();
int h = curPoint[0];
int y = curPoint[1];
int x = curPoint[2];
for (int m = 0; m < 6; m++) {
int nh = h + dh[m];
int ny = y + dy[m];
int nx = x + dx[m];
if (nh < 0 || ny < 0 || nx < 0 || nh >= H || ny >= N || nx >= M) continue;
if (box[nh][ny][nx] == 1) continue;
if (box[nh][ny][nx] == -1) continue;
//다음 좌표가 상자 범위 내이고 아직 방문 전이고 익지 않은 토마토인 경우
queue.offer(new int[]{nh, ny, nx}); //큐에 넣는다.
box[nh][ny][nx] = 1; //익은 토마토로 바꾼다.
visit[nh][ny][nx] = visit[h][y][x] + 1; //방문 표시 및 카운트를 증가시킨다.
}
}
}
int max = Integer.MIN_VALUE;
for (int i = 0; i < H; i++) {
for (int j = 0; j < N; j++) {
for (int k = 0; k < M; k++) {
//익지 않은 토마토가 있는 경우
if (box[i][j][k] == 0) {
System.out.println(-1);
return;
}
max = Math.max(max, visit[i][j][k]);
}
}
}
//1부터 시작하므로 1을 빼준다.
System.out.println(max - 1);
}
}
반응형
'코딩테스트 > BOJ' 카테고리의 다른 글
7562번 문제 나이트의 이동 자바(JAVA) 풀이 (0) | 2023.10.25 |
---|---|
10026번 문제 적록색약 자바(JAVA) 풀이 (0) | 2023.10.22 |
1012번 문제 유기농 배추 자바(JAVA) 풀이 (0) | 2023.10.22 |
1697번 문제 숨바꼭질 자바(JAVA) 풀이 (0) | 2023.10.22 |
4179번 문제 불! 자바(JAVA) 풀이 (0) | 2023.10.18 |
반응형