Development Palette

b1012_유기농배추 본문

Algorithm/Baekjoon

b1012_유기농배추

징주 2021. 9. 18. 02:05

 

 

1012번: 유기농 배추

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

www.acmicpc.net

 

package com.hotfive.workbook.b1012_유기농배추;

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 int [][] map;
    static boolean [][] visited;
    static int [] dr = {0,-1,0,1};
    static int [] dc = {1,0,-1,0};
    static int C;
    static int R;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for (int t = 0; t < T; t++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            C = Integer.parseInt(st.nextToken());   //가로길이 1 ≤ M ≤ 50
            R = Integer.parseInt(st.nextToken());   //세로길이 1 ≤ N ≤ 50
            int K = Integer.parseInt(st.nextToken());   //배추 개수 1 ≤ K ≤ 2500

            // 밭 그리기
            map = new int[R][C];
            for (int k = 0; k < K; k++) {
                st = new StringTokenizer(br.readLine());
                int c = Integer.parseInt(st.nextToken()); // 0 ≤ X ≤ M-1
                int r = Integer.parseInt(st.nextToken()); // 0 ≤ Y ≤ N-1
                map[r][c] = 1;  //배추위치 x,y
            }

            int count = 0; // 에벌레 수
            visited = new boolean[R][C];
            // 상하좌우에 배추가 있으면 한 묶음
            for (int i = 0; i < R; i++) {
                for (int j = 0; j < C; j++) {
                    if(visited[i][j] || map[i][j]==0) continue;
                    bfs(new int [] {i,j});
                    count++;
                }
            }
            System.out.println(count);
        }
        br.close();
    }

    private static void bfs(int[] v) {
        Queue<int []> queue = new LinkedList<>();
        queue.add(v);
        visited[v[0]][v[1]] = true;

        while (!queue.isEmpty()){
            v = queue.poll();

            // 사방탐색
            for (int d = 0; d < 4; d++) {
                int nr = v[0] + dr[d];
                int nc = v[1] + dc[d];

                if(nr<0||nc<0||nr>=R||nc>=C||visited[nr][nc]||map[nr][nc]==0) continue;

                visited[nr][nc] = true;
                queue.add(new int[] {nr,nc});
            }
        }
    }
}

 

배추가 모여있는 묶음을 찾기 위해서는 방문하지 않은 map 전체를 돌면서 bfs나 dfs를 이용해야한다. 묶음을 찾는다는 것은 이어져 있지 않은 배추의 첫 시작을 의미한다. 그렇기 때문에 방문여부를 꼭 확인해줘야한다.

이어져 있는 배추를 찾기 위해 bfs나 dfs를 시작할 때, 4방탐색을 해서 주위에 있는 배추를 확인한다. 마찬가지로 방문여부를 확인해야한다. BFS를 사용할 때 배추를 찾으면 Queue 에 넣어주고 방문체크를 해준다. DFS를 사용한다면 재귀로 배추를 넣어주면 된다.

BFS, DFS가 종료되면 배추가 모여있는 하나의 묶음을 다 찾은 것이다. 다음 배추 묶음을 찾기 위해서 다시 반복문으로 map을 돌면서 이어져 있지 않은 새로운 배추를 찾는걸 반복하여 배추묶음의 총 개수를 알 수 있다.

'Algorithm > Baekjoon' 카테고리의 다른 글

b2667_단지번호붙이기  (0) 2021.09.18
b1697_숨바꼭질  (0) 2021.09.18
b2178_미로탐색  (0) 2021.09.18
b1268_DFS와BFS  (0) 2021.09.16
b2636_치즈  (0) 2021.09.15
Comments