지구정복

[BFS] 백준 - 토마토 (7576) 본문

데이터 엔지니어링 정복/Algorithm

[BFS] 백준 - 토마토 (7576)

eeaarrtthh 2022. 5. 19. 15:57
728x90
반응형

-문제

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

 

7576번: 토마토

첫 줄에는 상자의 크기를 나타내는 두 정수 M,N이 주어진다. M은 상자의 가로 칸의 수, N은 상자의 세로 칸의 수를 나타낸다. 단, 2 ≤ M,N ≤ 1,000 이다. 둘째 줄부터는 하나의 상자에 저장된 토마토

www.acmicpc.net

 

-자바

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

class tomato {
    int x;
    int y;

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


public class Main {

    static int N, M;
    static int[][] map;
    static int[] dx = {-1, 1, 0, 0};
    static int[] dy = {0, 0, -1, 1};
    static Queue<tomato> q;

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

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

        st = new StringTokenizer( br.readLine() );
        M = Integer.parseInt( st.nextToken() );
        N = Integer.parseInt( st.nextToken() );

        map = new int[N][M];
        q = new LinkedList<tomato>();

        //애초부터 모든 토마토가 익어있는 경우를 위한 변수
        int tmp = 0;

        for( int i=0; i<N; i++ ) {
            st = new StringTokenizer( br.readLine() );
            for( int j=0; j<M; j++ ) {
                map[i][j] = Integer.parseInt( st.nextToken() );
                //익은 토마토 있으면 먼저 큐에 넣기
                if( map[i][j] == 1 ) {
                    q.add( new tomato(i, j) );
                    tmp++;
                }             
            }
        }

        if( tmp == N*M ) {
            System.out.println( 0 );
            System.exit(0);
        }

        System.out.println( BFS() );
    }

    public static int BFS() {
        while( !q.isEmpty() ) {
            tomato t = q.remove();

            int x = t.x;
            int y = t.y;

            for( int i=0; i<4; i++ ) {
                int nx = x + dx[i];
                int ny = y + dy[i];

                //범위 밖으로 벗어나면 패스
                if( nx<0 || ny<0 || nx>=N || ny>=M ) continue;

                //안익은 토마토라면
                if( map[nx][ny] == 0 ) {
                    //익은 토마토로 변경
                    q.add(new tomato(nx, ny));

                    //익은 날짜를 알기 위해 그 전 값에서 1증가
                    map[nx][ny] = map[x][y]+1;
                }
            }
        }

        //최대날짜
        int result = 0;

        for( int i=0; i<N; i++ ) {
            for( int j=0; j<M; j++ ) {
                //안익은 토마토가 있으면
                if( map[i][j] == 0 ) {
                    return -1;
                }

                //최대 날짜 구하기
                result = Math.max( result, map[i][j] );
            }
        }

        //걸린 일수는 최대 날짜에서 -1
        //왜냐하면 입력받을 때 큐에 집어넣은 토마토가 1부터 시작했기때문이다.
        return result-1;
    }
}

 

728x90
반응형
Comments