https://www.acmicpc.net/problem/7569
์ด ๋ฌธ์ ๋ ์ด์ ์ ํ์๋ 7576๋ฒ ํ ๋งํ ์ ๋น์ทํ ๋ฌธ์ ์ด๋ค.
์ด ๋ฌธ์ ์์์ ๋ค๋ฅธ ์ ์ ํ ๋งํ ๊ฐ 2์ฐจ์ ๋ฐฐ์ด์ ๋ด๊ธฐ๋๊ฒ ์๋๋ผ, 3์ฐจ์ ๋ฐฐ์ด์ ๋ด๊ธฐ๊ธฐ ๋๋ฌธ์ ์,ํ,์ข,์ฐ,์,๋ค๊น์ง ์ด 6๋ฒ์ ์ฒดํฌํด์ค์ผํ๋ค.
โ๏ธ ๋ฌธ์
๐ ๋ฌธ์ ํด๊ฒฐ
์ด๋ ค์ธ ๊ฒ์ด ์๋ค. ์ด์ ๊ณผ ๋์ผํ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌํ ๊ฒ์ด๊ณ , ๊ทธ์ ์ฒดํฌํด์ผ ํ ๊ณณ์ด 2๊ณณ์ด ๋์๋ค๋ ์ ์ธ์๋ ๋ง์ด๋ค.
ํ ๋งํ ๋ฅผ ๋ด๊ธฐ ์ํ 3์ฐจ์ ๋ฐฐ์ด์ ์์ฑํด์ค๋ค. (๋ ์ง๋ฅผ ๊ณ์ฐํ๊ธฐ ์ํ days ๋ฐฐ์ด๋ ์ ์ธํด์ค๋ค.)
int[][][] tomatos = new int[H][N][M]; // ๋์ด๊ฐ H์ด๊ณ , ๊ฐ๋ก๊ฐ N, ์ธ๋ก๊ฐ M
int[][][] days = new int[H][N][M];
ํ์ ์ขํ๊ฐ์ ๋ฃ์ด์ฃผ๊ธฐ์ํด 2์ฐจ์ ํ ๋งํ ๋ฌธ์ ์์๋ Pair๋ผ๋ ํด๋์ค๋ฅผ ์์ฑํ์ง๋ง, ์ด๋ฒ์๋ 3์ฐจ์์ด๊ธฐ ๋๋ฌธ์ Triple์ด๋ผ๋ ํด๋์ค๋ฅผ ์์ฑํ๋๋ก ํ๊ฒ ๋ค.
public static class Triple{
int x, y, z;
public Triple(int x, int y, int z){
this.x = x;
this.y = y;
this.z = z;
}
// getter,setter ์๋ต
}
๊ทธ๋ฆฌ๊ณ ์ด์ ์๋ dx, dy ์ขํ๋ฅผ ๋ฏธ๋ฆฌ ์ ์ธํด๋์์ง๋ง, ์ด๋ฒ์๋ dz ๊น์ง ๋ฏธ๋ฆฌ ์ ์ธ์ ํด๋์.
int[] dx = {1, 0 , -1, 0 , 0 , 0};
int[] dy = {0, 1 , 0, -1 , 0 , 0};
int[] dz = {0, 0 , 0, 0 , 1 , -1};
์ด์ ์ ๋ ฅ์ ๋ฐ์๊ณผ ๋์์ ํ ๋งํ ๊ฐ ์ต์์ผ๋ฉด (๊ฐ์ด 1์ด๋ฉด) ํ์ ๋ฃ์ด์ฃผ๊ณ , days ๋ฐฐ์ด์ ๊ฐ์ 0์ผ๋ก ๋ณ๊ฒฝํด์ค๋ค.
๋ง์ผ, 0์ด๊ฑฐ๋ -1์ธ ๊ฒฝ์ฐ์๋ days๋ฐฐ์ด์ -1 ๊ฐ์ ๋ฃ์ด์ค๋ค.
for(int p=0; p<H; p++){
for(int i=0; i<N; i++){
StringTokenizer st = new StringTokenizer(bf.readLine());
for(int j=0; j<M; j++){
tomatos[p][i][j] = Integer.parseInt(st.nextToken());
if(tomatos[p][i][j] == 1) {
qu.offer(new Triple(p, i, j)); // Triple์ด๋ผ๋ ํด๋์ค์ ๊ฐ๋ก,์ธ๋ก,๋์ด๋ฅผ ์ ์ฅ!
days[p][i][j] = 0; // 0์ผ๋ก ์ค์ !
}else{
days[p][i][j] = -1; // -1์ผ๋ก ์ค์ !
if(tomatos[p][i][j] == 0){
notYet++; // ์์ต์ ํ ๋งํ ์ ๊ฐ์ ์ฆ๊ฐ
}
}
}
}
}
์ด์ ๊ฐ์ฅ ์ค์ํ ๋ถ๋ถ์ธ BFS ํ์์ ํ๋ ์ฝ๋์ด๋ค. ์ด์ ๊ณผ ๋ฌ๋ผ์ง ์ ์ ์๋ค.
// BFS!
while(!qu.isEmpty()){
Triple t = qu.poll();
for(int i = 0; i < 6; i++){ // ์ด์ ๋ ์ํ์ข์ฐ์๋ค๊น์ง ํ์ํด์ค๋ค.
int nX = t.x + dx[i];
int nY = t.y + dy[i];
int nZ = t.z + dz[i];
// ๋ฒฝ์ ๋ถ๋ชํ๊ฑฐ๋, ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ์ขํ๋ PASS
if(nX < 0 || nX >= N || nY < 0 || nY >= M || nZ < 0 || nZ >= H){
continue;
}
// ํ ๋งํ ๊ฐ ๋ง์ฝ ์๊ฑฐ๋, ์ด๋ฏธ ๋ฐฉ๋ฌธํ ํ ๋งํ ๋ PASS
if(tomatos[nZ][nX][nY] == -1 || days[nZ][nX][nY] != -1){
continue;
}
// ์ต์ ํ ๋งํ ์ ์ธ์ ํ ์ต์ง ์์ ํ ๋งํ ๋ค์ ํ์ ๋ฃ์ด์ฃผ๊ณ ์ต์ง ์์ ํ ๋งํ ์ ๊ฐ์ -1 ํด์ค๋ค.
qu.offer(new Triple(nX, nY, nZ)); notYet--;
days[nZ][nX][nY] = days[t.z][t.x][t.y] + 1;
if(days[nZ][nX][nY] > result){
result = days[nZ][nX][nY];
}
}
}
๐ฅ ์ ์ฒด ์ฝ๋
import java.util.*;
import java.io.*;
public class Main {
public static void main(String args[]) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int M = Integer.parseInt(st.nextToken());
int N = Integer.parseInt(st.nextToken());
int H = Integer.parseInt(st.nextToken());
int notYet = 0;
int result = 0;
int[][][] days = new int[H][N][M]; // ๋ ์ง๋ฅผ ๊ณ์ฐํ๋ 3์ฐจ์๋ฐฐ์ด
int[][][] tomatos = new int[H][N][M]; // ํ ๋งํ ์ ์ํ๋ฅผ ์ ์ฅํ๋ 3์ฐจ์๋ฐฐ์ด
int[] dx = {1, 0, -1, 0, 0, 0};
int[] dy = {0, 1, 0, -1, 0, 0};
int[] dz = {0, 0, 0, 0, 1, -1};
Queue<Triple> qu = new LinkedList<>();
for(int p=0; p<H; p++){
for(int i=0; i<N; i++){
st = new StringTokenizer(bf.readLine());
for(int j=0; j<M; j++){
tomatos[p][i][j] = Integer.parseInt(st.nextToken());
if(tomatos[p][i][j] == 1){
qu.offer(new Triple(i, j, p));
days[p][i][j] = 0;
}else{
days[p][i][j] = -1;
if(tomatos[p][i][j] == 0){
notYet++;
}
}
}
}
}
if(notYet == 0){
System.out.print(0);
System.exit(0);
}
while(!qu.isEmpty()){
Triple t = qu.poll();
for(int i = 0; i < 6; i++){
int nX = t.x + dx[i];
int nY = t.y + dy[i];
int nZ = t.z + dz[i];
if(nX < 0 || nX >= N || nY < 0 || nY >= M || nZ < 0 || nZ >= H){
continue;
}
if(tomatos[nZ][nX][nY] == -1 || days[nZ][nX][nY] != -1){
continue;
}
qu.offer(new Triple(nX, nY, nZ)); notYet--;
days[nZ][nX][nY] = days[t.z][t.x][t.y] + 1;
if(days[nZ][nX][nY] > result){
result = days[nZ][nX][nY];
}
}
}
if(notYet > 0){
System.out.print(-1);
}else{
System.out.print(result);
}
}
public static class Triple {
int x, y, z;
public Triple(int x, int y, int z){
this.x = x;
this.y = y;
this.z = z;
}
public int getX(){
return x;
}
public int getY(){
return y;
}
public int getZ(){
return z;
}
public void setX(int x){
this.x = x;
}
public void setY(int y){
this.y = y;
}
public void setZ(int z){
this.z = z;
}
}
}