우보천리 개발

[BJ] 7576 토마토 Java 본문

알고리즘/백준

[BJ] 7576 토마토 Java

밥은답 2023. 1. 29. 18:33
반응형

백준 7576 토마토

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

 

7576번: 토마토

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

www.acmicpc.net

아이디어

  • BFS로 탐색을 하는데, 익은 토마토와 인접한 곳부터 익어야하기 때문에 큐에 익은 토마토를 미리 다 넣어준다.
  • 2차원 배열로 만들어서 탐색하는데, 1인 곳은 새로 정의한 Tomato 클래스로 미리 큐에 넣는다
  • 그렇게 되면 1과 인접한 곳부터 모두 탐색하는데 0이 아닌곳은 탐색하지 않음
  • 마지막에 배열을 확인해서 익지 않은 토마토가 있는지, 아니면 모두 익었는지 확인
  • 토마토가 익는 일수에서 -1은 첫날에 있는 토마토는 일수에 카운팅 하지 않기 때문이다

코드

package baekjoon;
import java.util.*;

class Tomato {
    private int x, y;
    public Tomato(int x, int y) {
        this.x=x;
        this.y=y;
    }

    public int getX() {
        return x;
    }

    public int getY() {
        return y;
    }
}



class BJ7576 {
    static boolean visited[][];
    static int[][] map;
    static int dx[] = {1,-1,0,0};
    static int dy[] = {0,0,-1,1};
    static int n,m,answer;
    static Queue<Tomato> q = new LinkedList<>();

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        map = new int[m][n];

        for (int i=0; i<m; i++) {
            for (int j=0; j<n; j++) {
                map[i][j] = sc.nextInt();
            }
        }

        for (int i=0; i<m; i++) {
            for (int j=0; j<n; j++) {
                if (map[i][j] == 1) q.offer(new Tomato(i,j));
            }
        }
        int max = Integer.MIN_VALUE;
        BFS();

//        for (int i=0; i<m; i++) {
//            System.out.println(Arrays.toString(map[i]));
//        }

        for (int i=0; i<m; i++) {
            for (int j=0; j<n; j++) {
                if (map[i][j] == 0) {
                    System.out.println(-1);
                    return;
                }
                else max = Math.max(map[i][j], max);
            }
        }
        System.out.println(max-1);
    }

    public static void BFS() {
        while (!q.isEmpty()) {
            Tomato tmp = q.poll();
            int tx = tmp.getX();
            int ty = tmp.getY();

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

                if (nx>=0 && nx<m && ny>=0 && ny<n) {
                    if (map[nx][ny] == 0) {
                        answer++;
                        map[nx][ny] = map[tx][ty] + 1;
                        q.offer(new Tomato(nx, ny));
                    }
                }
            }
        }
    }

}
반응형

'알고리즘 > 백준' 카테고리의 다른 글

[BJ] 18405 경쟁적 전염 Java  (0) 2023.01.29
[BJ] 18405 경쟁적 전염 Java  (0) 2023.01.29
[BJ] 1325 효율적인 해킹 Java  (0) 2023.01.26
[BJ] 18352 특정 거리의 도시 찾기 Java  (0) 2023.01.26
[BJ] 1744 수 묶기 Java  (0) 2023.01.26
Comments