https://www.acmicpc.net/problem/7569
7569번: 토마토
첫 줄에는 상자의 크기를 나타내는 두 정수 M,N과 쌓아올려지는 상자의 수를 나타내는 H가 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M ≤ 100, 2 ≤ N ≤ 100,
www.acmicpc.net
아래 문제에서 조금 더 발전된 버전이다
[백준 BOJ/Gold V] 7576번 : 토마토
https://www.acmicpc.net/problem/7576 7576번: 토마토 첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘
fruits2lim.tistory.com
7576번은 2차원 배열 7569번은 3차원 배열..!
3차원 배열로 놓고 z축 기준으로도 -1, 1 해준것을 생각해주면 된다
최종 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayDeque;
import java.util.Arrays;
import java.util.Deque;
import java.util.StringTokenizer;
public class Main {
static int M; // 상자의 가로 칸의 수, j
static int N; // 상자의 세로 칸의 수, i
static int H; // H번 반복(수직으로 쌓이는 상자 개수), k
static int[][][] box;
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 Deque<int[]> dq;
static int answer;
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());
box = new int[H][N][M];
dq = new ArrayDeque<>();
int count = 0; // 0 있는지 확인하는 용도
for (int k = 0; k < H; k++) {
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
box[k][i][j] = Integer.parseInt(st.nextToken());
if (box[k][i][j] == 1) dq.addLast(new int[] {k, i, j});
else if (box[k][i][j] == 0) count++;
}
}
}
// System.out.println(Arrays.deepToString(box));
if (count != 0) { // 0이 없으면 계산할 필요가 없음
bfs();
answer = answer - 1; // 처음에 2부터 넣었기 때문에 최종 답은 -1 해야함
loop:
for (int k = 0; k < H; k++) {
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
if (box[k][i][j] == 0) {
answer = -1;
break loop;
}
}
}
}
}
System.out.println(answer);
}
static void bfs() {
while (!dq.isEmpty()) {
int[] zxy = dq.pollFirst();
int z = zxy[0];
int x = zxy[1];
int y = zxy[2];
for (int i = 0; i < 6; i++) {
int nz = z + dz[i];
int nx = x + dx[i];
int ny = y + dy[i];
if (nz >=0 && nz < H && nx >=0 && nx < N && ny >= 0 && ny < M) {
if (box[nz][nx][ny] == 0) {
dq.addLast(new int[] {nz, nx, ny});
box[nz][nx][ny] = box[z][x][y] + 1;
}
answer = Math.max(answer, box[nz][nx][ny]);
}
}
}
}
}
'코딩테스트-알고리즘 > 백준 BOJ' 카테고리의 다른 글
[백준 BOJ/Silver I] 2468번 : 안전 영역 (0) | 2024.03.05 |
---|---|
[백준 BOJ/Gold IV] 3055번 : 탈출 (1) | 2024.02.25 |
[백준 BOJ/Gold IV] 14502번 : 연구소 (0) | 2024.02.22 |
[백준 BOJ/Silver I] 1697번 : 숨바꼭질 (0) | 2024.02.20 |
[백준 BOJ/Silver II] 11724번 : 연결 요소의 개수 (0) | 2024.02.15 |