728x90
1. 문제
https://www.acmicpc.net/problem/7569
2022.02.24 - [코딩테스트/BOJ] - [BOJ] 7576 토마토 - JAVA 문제에서 높이(H)만 추가되었다.
2. 풀이
- 다른 건 전부 2022.02.24 - [코딩테스트/BOJ] - [BOJ] 7576 토마토 - JAVA 와 같고 대신 출력만 달라졌다.
- 토마토를 입력받을 때마다 카운트를 세서 총 상자에 토마토가 몇개있는지 저장했다. 그리고 토마토가 익을 때마다 카운트를 뺐다.
- 마지막에 카운트가 0이면 토마토가 모두 익었다는 뜻이므로 depth를 그대로 출력하고, 아니라면 -1을 출력한다.
import java.io.*;
import java.util.*;
public class BOJ_7569_토마토 {
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
int H = Integer.parseInt(st.nextToken());
int[][][] tomato = new int[H][N][M];
Queue<int[]> queue = new LinkedList<>();
int count = 0;
for (int h = 0; h < H; h++) {
for (int n = 0; n < N; n++) {
st = new StringTokenizer(in.readLine());
for (int m = 0; m < M; m++) {
tomato[h][n][m] = Integer.parseInt(st.nextToken());
if (tomato[h][n][m] == 1) queue.offer(new int[]{h, n, m});
if(tomato[h][n][m]>=0) ++count;
}
}
}
int[][] deltas = {{0, 1, 0}, {0, -1, 0}, {0, 0, 1}, {0, 0, -1}, {1, 0, 0}, {-1, 0, 0}};
int depth = 0;
int[] v;
while (!queue.isEmpty()) {
v = queue.poll();
depth = Math.max(depth, tomato[v[0]][v[1]][v[2]] - 1);
--count;
for (int d = 0; d < 6; d++) {
int nh = v[0] + deltas[d][0];
int ny = v[1] + deltas[d][1];
int nx = v[2] + deltas[d][2];
if (ny < 0 || ny >= N || nx < 0 || nx >= M || nh < 0 || nh >= H || tomato[nh][ny][nx] != 0) continue;
tomato[nh][ny][nx] = tomato[v[0]][v[1]][v[2]] + 1;
queue.offer(new int[]{nh, ny, nx});
}
}
System.out.println(count==0?depth:-1);
}
}
3. 결과
아랫줄이 탐색 끝난 후 반복문으로 안익은 토마토가 있는지 체크하는 코드고, 윗줄이 미리 카운트를 세서 토마토가 익을때마다 --count해준 코드다. 메모리는 비슷한데 시간이 확실히 줄어들었다.
'코딩테스트 > BOJ' 카테고리의 다른 글
[BOJ] 17413 단어뒤집기 2 - JAVA (0) | 2022.02.25 |
---|---|
[BOJ] 1697 숨바꼭질 - JAVA (0) | 2022.02.25 |
[BOJ] 7576 토마토 - JAVA (0) | 2022.02.24 |
[BOJ] 11399 ATM - JAVA (0) | 2022.02.24 |
[BOJ] 10026 적록색약 - JAVA (0) | 2022.02.24 |
댓글