Java

[백준 7569] 토마토 (JAVA)

iheeeee6-6 2023. 3. 28. 14:51
728x90

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

 

7569번: 토마토

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

www.acmicpc.net

 

 

이 문제를 풀기 전에 아래의 문제를 푸시는 것을 추천드립니다!

https://iheeeee6-6.tistory.com/21

 

[백준 7576] 토마토 풀이 (JAVA)

https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘

iheeeee6-6.tistory.com

 

1. 3차원 배열을 생성하고 익은 토마토일 경우에는 큐에 넣기, 안익은 토마토 수도 야무지게 세주기

2. bfs를 사용하여 6방향을 체크! - 배열에 해당 칸의 토마토가 익은 날짜 넣기 (영향 준 칸의 값 +1) , 최대일 수 계산해 놓기

3. 안익은 토마토가 있을 경우에는 -1, 다 익었을 경우에는 최대 일수 -1 출력

 

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 m, n, h, yet = 0, count = 0;
	static int[][][] arr;
	static boolean[][][] check;
	static int[] dx = { 1, -1, 0, 0, 0, 0 };
	static int[] dy = { 0, 0, 1, -1, 0, 0 };
	static int[] dz = { 0, 0, 0, 0, 1, -1 };
	static Queue<Dot> q;

	static class Dot {
		int x, y, z;

		Dot(int x, int y, int z) {
			this.x = x;
			this.y = y;
			this.z = z;
		}
	}

	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());
		arr = new int[n][m][h];
		q = new LinkedList<>();
		check = new boolean[n][m][h];
		for (int i = 0; i < h; i++) {
			for (int j = 0; j < n; j++) {
				st = new StringTokenizer(br.readLine());
				for (int z = 0; z < m; z++) {
					arr[j][z][i] = Integer.parseInt(st.nextToken());
					if (arr[j][z][i] == 0)
						yet++;
					else if (arr[j][z][i] == 1)
						q.add(new Dot(j, z, i));
				}
			}
		}

		check = new boolean[n][m][h];
		while (!q.isEmpty()) {
			find(q.poll());
		}
		System.out.println(yet==0?(count==0?0:count-1):-1);

	}

	static void find(Dot d) {
		for (int i = 0; i < 6; i++) {
			int xx = d.x + dx[i];
			int yy = d.y + dy[i];
			int zz = d.z + dz[i];
			if (xx >= 0 && yy >= 0 && zz >= 0 && xx < n && yy < m && zz < h && !check[xx][yy][zz]) {
				check[xx][yy][zz] = true;
				if (arr[xx][yy][zz] == 0) {
					yet--;
					arr[xx][yy][zz] = arr[d.x][d.y][d.z]+1;
					count=Math.max(count, arr[xx][yy][zz]);
					q.add(new Dot(xx, yy, zz));
				} else if (arr[xx][yy][zz] == 1) {
					q.add(new Dot(xx, yy, zz));
				}
			}
		}
	}

}

'Java' 카테고리의 다른 글

[백준 9466] 텀 프로젝트 (JAVA)  (0) 2023.04.03
[백준 1107] 리모컨 (JAVA)  (0) 2023.03.29
[백준 2636] 치즈 (JAVA)  (0) 2023.03.28
[백준 1826] 연료 채우기 (JAVA)  (0) 2023.03.28
[백준 6588] 골드바흐의 추측 (JAVA)  (0) 2023.03.25