Development Palette

b2667_단지번호붙이기 본문

Algorithm/Baekjoon

b2667_단지번호붙이기

징주 2021. 9. 18. 02:30

 

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여

www.acmicpc.net

1. DFS

package com.hotfive.workbook.b2667_단지번호붙이기;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;

public class Main_DFS {
    static int N;
    static int [][] map;
    static boolean [][] visisted;
    static ArrayList<Integer> dangi = new ArrayList<>();
    static int homeCnt;
    // 우 하 좌 상
    static int [] dr = {0,-1,0,1};
    static int [] dc = {1,0,-1,0};
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        map = new int[N][N];
        for (int i = 0; i < N; i++) {
            String str = br.readLine();
            for (int j = 0; j < N; j++) {
                map[i][j] = str.charAt(j)-'0';
            }
        }

        visisted = new boolean[N][N];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if(visisted[i][j]||map[i][j]==0) continue;
                // 집을 발견할 때..
                homeCnt = 0;
                dfs(new int []{i,j});   // dfs 탐색 시작
                dangi.add(homeCnt);
            }
        }

        System.out.println(dangi.size());
        Collections.sort(dangi);
        for (int i: dangi) {
            System.out.println(i);
        }
        br.close();
        //첫 번째 줄에는 총 단지수를 출력하시오.
        // 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오
    }

    private static void dfs(int[] v) {
        visisted[v[0]][v[1]] = true;
        homeCnt++;

        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>=N||nc>=N||visisted[nr][nc]||map[nr][nc]==0) continue;
            dfs(new int[]{nr,nc});
        }


    }
}

 

2. BFS

package com.hotfive.workbook.b2667_단지번호붙이기;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;

public class Main_BFS {
    static int N;
    static int [][] map;
    static boolean [][] visisted;
    static ArrayList<Integer> dangi = new ArrayList<>();
    static int homeCnt;
    // 우 하 좌 상
    static int [] dr = {0,-1,0,1};
    static int [] dc = {1,0,-1,0};
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        N = Integer.parseInt(br.readLine());

        map = new int[N][N];
        for (int i = 0; i < N; i++) {
            String str = br.readLine();
            for (int j = 0; j < N; j++) {
                map[i][j] = str.charAt(j)-'0';
            }
        }

        visisted = new boolean[N][N];
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                if(i<0 || j<0 || i>=N || j>= N || visisted[i][j]||map[i][j]==0) continue;
                // 집을 발견할 때..
                homeCnt = 0;
                bfs(new int []{i,j});   // bfs 탐색 시작

            }
        }

        System.out.println(dangi.size());
        Collections.sort(dangi);
        for (int i:
             dangi) {
            System.out.println(i);
        }
        br.close();
        //첫 번째 줄에는 총 단지수를 출력하시오.
        // 각 단지내 집의 수를 오름차순으로 정렬하여 한 줄에 하나씩 출력하시오
    }

    private static void bfs(int[] v) {
        Queue<int []> queue = new LinkedList<>();

        // 한 단지의 첫번째 집부터 시작
        queue.add(v);
        visisted[v[0]][v[1]] = true;

        // 그 단지의 집 갯수 증가
        homeCnt++;

        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>=N || nc>=N || visisted[nr][nc]||map[nr][nc]==0) continue;

                //조건 만족하면
                queue.add(new int[] {nr,nc});
                visisted[nr][nc] = true;

                // 단지의 home 개수증가
                homeCnt++;

            }
        }

        // bfs 끝나면,, 단지의 home이 다 탐색되었다는 의미.. 집의 개수를 저장해서 마무리
        dangi.add(homeCnt);
    }
}

유기농 배추와 비슷한문제 

단지(이어진 집들의 묶음)의 개수를 찾는 문제이다

이러한 문제들은  4방탐색으로 BFS를 돌리고 BFS 메소드 안에서도 4방탐색으로 이어진 노드를 찾아줘야한다. 

즉, 4방탐색 두번써야돼

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

b7576_토마토(4방향)  (0) 2021.09.24
b2606_바이러스  (0) 2021.09.18
b1697_숨바꼭질  (0) 2021.09.18
b1012_유기농배추  (0) 2021.09.18
b2178_미로탐색  (0) 2021.09.18
Comments