코딩테스트/BOJ

[BOJ] 7569 토마토 - JAVA

5월._. 2022. 2. 24.
728x90

1. 문제

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

 

7569번: 토마토

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

www.acmicpc.net

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

댓글