본문 바로가기
코딩테스트

[백준1012] 유기농 배추[java]

by 근즈리얼 2021. 3. 23.
728x90


앞에서 풀었던 아파트 번호 붙이기와 매우 유사한 문제였다.

배추를 표시할 map과 방문했는지를 확인하기 위한 check를 이차원 배열로 만들고

위, 아래, 오른쪽, 왼쪽을 봐야하므로 dx와 dy를 만들어둔다dx[] = {0,0,1,-1}, dy[] = {1,-1,0,0};

그리고 for문을 이용해 배추가 있는 곳은 map에서 1로 만들어 주고 방문하지 않고 map에서 1이면 dfs메소드를 통해 근처의 방문 여부를 확인해 주면 된다.

 

코드

package baekjoon;

import java.util.Scanner;

public class organic_cabbage {
    static int[][] map;
    static boolean[][] check;
    static int cnt=0;
    public static int dx[] = {0,0,1,-1};
    public static int dy[] = {1,-1,0,0};
    static int m,n;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int t = sc.nextInt();
        for(int i = 0; i<t;i++){
            m = sc.nextInt();
            n = sc.nextInt();
            int k = sc.nextInt();

            map = new int[m][n];
            check = new boolean[m][n];
            for(int j = 0; j<k;j++){
                int x = sc.nextInt();
                int y = sc.nextInt();

                map[x][y] = 1;
            }
            for(int x = 0; x<m;x++){
                for(int y = 0; y<n;y++){
                    if(map[x][y] == 1 && !check[x][y]){
                        cnt++;
                        dfs(x,y);
                    }
                }
            }
            System.out.println(cnt);
            cnt = 0;
        }
    }

    private static void dfs(int x, int y) {
        check[x][y] = true;

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

            if(nx>=0 && ny>=0 && nx <m && ny<n){
                if(map[nx][ny] == 1 && !check[nx][ny]){
                    dfs(nx,ny);
                }
            }
        }
    }
}
728x90

'코딩테스트' 카테고리의 다른 글

[백준7576] 토마토[java]  (0) 2021.03.23
[백준2178] 미로 탐색 [java]  (1) 2021.03.23
[백준2667] 단지번호붙이기 [ java]  (0) 2021.03.22
[백준2606] 바이러스 [java]  (0) 2021.03.22
[백준1260번] DFS와 BFS  (0) 2021.03.18

댓글