토마토 7569

LJM·2023년 7월 7일
0

백준풀기

목록 보기
166/259

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

처음에 기존에 짜던데로 하면 시간초과가 나서 어떻게 개선해야할지 고민하다 검색해보고 개선하였다

큐에 1인걸 처음에 다 집어넣고 그냥 돌리면 된다...
근데 카운트를 하루에 한번씩 올려야하기 때문에 for문이 한번더 들어가는 구조를 사용해서3중 for문이 된다. 큐를 한번에 다 비우는 방식으로 해야해서 그렇다

import java.io.*;
import java.util.*;

class Node{
    int i;
    int j;
    int k;

    public Node(int i, int j, int k){
        this.i = i;
        this.j = j;
        this.k = k;
    }
}

public class Main {
    public static void main(String[] args) throws IOException{

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        String[] input = br.readLine().split(" ");
        int M = Integer.parseInt(input[0]);
        int N = Integer.parseInt(input[1]);
        int H = Integer.parseInt(input[2]);

        int[][][] map = new int[H][N][M];

        Queue<Node> pq = new LinkedList<>();

        for (int i = 0; i < H; i++) {
            for (int j = 0; j < N; j++) {
                input = br.readLine().split(" ");
                for (int k = 0; k < M; k++) {
                    int temp = Integer.parseInt(input[k]);
                    map[i][j][k] = temp;
                    if(1 == temp)
                        pq.add(new Node(i,j,k));
                }
            }
        }

        int answer = 0;
        int zerocheck = 0;

        for (int i = 0; i < H; i++) {
            for (int j = 0; j < N; j++) {
                for (int k = 0; k < M; k++) {
                    if(0 == map[i][j][k])
                        zerocheck++;
                }
            }
        }
        if(zerocheck == 0){
            System.out.println(0);
            return;
        }

        answer = bfs(pq, map, M, N, H);

        zerocheck = 0;
        for (int i = 0; i < H; i++) {
            for (int j = 0; j < N; j++) {
                for (int k = 0; k < M; k++) {
                    if (0 == map[i][j][k])
                        zerocheck++;
                }
            }
        }

        if(zerocheck != 0)//막힌게 있음
            answer = -1;

        System.out.println(answer);
    }

    public static int bfs(Queue<Node> pq, int[][][] map, int M, int N, int H){

        int count = 0;
        int[][] dir = { {0, -1, 0}, {0, 0, 1}, {0, 1, 0}, {0, 0, -1}, {1, 0, 0}, {-1, 0, 0} };

        while(pq.isEmpty() == false){
            int size = pq.size();
            count++;

            for (int l = 0; l < size ; l++) {
                Node cur = pq.poll();
                for (int m = 0; m < 6; m++) {
                    int ni = cur.i + dir[m][0];
                    int nj = cur.j + dir[m][1];
                    int nk = cur.k + dir[m][2];

                    if(ni < 0 || ni >= H)
                        continue;
                    if(nj < 0 || nj >= N)
                        continue;
                    if(nk < 0 || nk >= M)
                        continue;
                    if(map[ni][nj][nk] != 0)
                        continue;

                    map[ni][nj][nk] = 1;
                    pq.add(new Node(ni, nj, nk));
                }
            }
        }

        return count-1;
    }
}
profile
게임개발자 백엔드개발자

0개의 댓글