알고리즘/BAEKJOON

[백준] 1202 유기농 배추 (Java)

kyeee2 2022. 3. 3. 22:19

[1012 유기농배추]

난이도: 실버2

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

문제

입력

출력


[아이디어]

  • 배추밭을 완전 탐색한다.
  • 배추가 심어져 있는 위치에서 BFS를 사용하여 서로 인접해있는 배추를 체크한다.
  • 몇 개의 배추 더미가 있는지 세어준다.

[JAVA 코드]

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

public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder output = new StringBuilder();
    static StringTokenizer tokens;

    static int T, N, M, K, cnt;
    static boolean [][] map;
    static Queue<Point> Q;
    static int [] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};

    static class Point {
        int r, c;

        public Point(int r, int c) {
            this.r = r;
            this.c = c;
        }
    }

    public static void main(String[] args) throws NumberFormatException, IOException {
        T = Integer.parseInt(br.readLine());
        for(int t = 0; t < T; t++) {
            tokens = new StringTokenizer(br.readLine());
            M = Integer.parseInt(tokens.nextToken());
            N = Integer.parseInt(tokens.nextToken());
            K = Integer.parseInt(tokens.nextToken());

            map = new boolean [N][M];
            for(int i = 0; i < K; i++) {
                tokens = new StringTokenizer(br.readLine());

                int c = Integer.parseInt(tokens.nextToken());
                int r = Integer.parseInt(tokens.nextToken());
                map[r][c] = true;
            }

            Q = new LinkedList<>();
            cnt = 0; // 배추벌레 개수

            for(int r = 0; r < N; r++) {
                for(int c = 0; c < M; c++) {
                    if(map[r][c]) { // 배추가 심어져 있다면

                        BFS(r, c);
                    }
                }
            }

            output.append(cnt).append('\n');
        }
        System.out.println(output);
    }

    private static void BFS(int r, int c) {    
        Q.offer(new Point(r, c));
        map[r][c] = false;
        cnt++;

        while(!Q.isEmpty()) {
            Point p = Q.poll();

            for(int i = 0; i < 4; i++) {
                int nr = p.r + dx[i];
                int nc = p.c + dy[i];

                if(isIn(nr, nc) && map[nr][nc]) {
                    Q.offer(new Point(nr, nc));
                    map[nr][nc] = false;
                }
            }
        }
    }

    private static boolean isIn(int r, int c) {
        return r >= 0 && r < N && c >= 0 && c < M;
    }

}