https://www.acmicpc.net/problem/7569
예전에 풀었던 토마토문제와 아주 유사한 문제 3차원 배열을 사용해야하는것 말고는 크게 다른점을 느끼지 못했고 bfs를 이용하여 문제를 풀이했다.
import java.io.*;
import java.util.*;
public class Main {
public static int N, M, H, zero = 0, ans = 0;
public static int[][][] map;
public static Queue<int[]> q = new LinkedList<>();
public static int[] dr = {0, 0, -1, 0, 1, 0};
public static int[] dc = {0, 0, 0, 1, 0, -1};
public static int[] dh = {-1, 1, 0, 0, 0, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
M = Integer.parseInt(st.nextToken());
N = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
map = new int[N][M][H];
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++){
map[j][k][i] = Integer.parseInt(st.nextToken());
if(map[j][k][i] == 0) zero++;
else if(map[j][k][i] == 1) q.offer(new int[] {j, k, i});
}
}
}
bfs();
}
public static void bfs() {
while(!q.isEmpty()){
int size = q.size();
for(int i = 0; i < size; i++){
int[] cur = q.poll();
for(int d = 0; d < 6; d++){
int nr = cur[0] + dr[d];
int nc = cur[1] + dc[d];
int nh = cur[2] + dh[d];
if(nr < 0 || nr >= N || nc < 0 || nc >= M || nh < 0 || nh >= H || map[nr][nc][nh] != 0) continue;
map[nr][nc][nh] = 1;
zero--;
q.offer(new int[] {nr, nc, nh});
}
}
ans++;
}
if(zero == 0) System.out.println(ans - 1);
else System.out.println(-1);
}
}
마지막에 들어와 1이 된 토마토까지 탐색을하기 때문에 zero를 감지해서 while 문을 바로 빠져나오거나 ans 에 1을 빼주면 된다.
풀어본 문제라 크게 어렵진 않았고 풀이시간은 15분정도 걸렸다.
'코딩테스트 > JAVA' 카테고리의 다른 글
| [백준 JAVA] 9663번: N - Queen (0) | 2025.09.25 |
|---|---|
| [백준 JAVA] 9251번: LCS (0) | 2025.09.24 |
| [백준 JAVA] 3190번: 뱀 (0) | 2025.09.23 |
| [백준 JAVA] 알고리즘 재활훈련 (심화) (0) | 2025.09.19 |
| [백준 JAVA] 알고리즘 재활훈련 (기초) (0) | 2025.09.17 |