Competition/Baekjoon

[백준] 2667번 단지번호 매기기

bisi 2020. 3. 22. 12:12
문제 출처 

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

 

2667번: 단지번호붙이기

<그림 1>과 같이 정사각형 모양의 지도가 있다. 1은 집이 있는 곳을, 0은 집이 없는 곳을 나타낸다. 철수는 이 지도를 가지고 연결된 집들의 모임인 단지를 정의하고, 단지에 번호를 붙이려 한다. 여기서 연결되었다는 것은 어떤 집이 좌우, 혹은 아래위로 다른 집이 있는 경우를 말한다. 대각선상에 집이 있는 경우는 연결된 것이 아니다. <그림 2>는 <그림 1>을 단지별로 번호를 붙인 것이다. 지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수

www.acmicpc.net

 

 

 

접근 방식 및 풀이

아직도 감이 안온다.. 이해한 부분까지는 코드에 주석으로 달았다. 

 

참고 사이트 : https://ballpython.tistory.com/7

 

[백준 2667 : 단지번호 붙이기] Java, DFS

단지 번호 붙이기를 DFS로 풀어보았습니다. 개인적으로 BFS보다 DFS가 코드가 간결하고 쉽네요. find 함수에서, 주어진 좌표의 사방을 돌면서 조건에 만족하는 값에 대해서 다시 find 함수를 호출하게 됩니다. 그..

ballpython.tistory.com

 

 

 

 

소스 코드 
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main {

    static int count, n;
    static int dx[] = {-1,1,0,0};
    static int dy[] = {0,0,-1,1};
    static int[][] arr;
    static int[][] house;
    static ArrayList al = new ArrayList();
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        arr = new int[n][n];
        house = new int[n][n];
        // 배열만들고
        for (int i = 0; i <n ; i++) {
            String[] tmp = br.readLine().split("");
            for (int j = 0; j <n ; j++) {
                arr[i][j] = tmp[j].charAt(0) - '0';
            }
        }

        for (int i = 0; i <n ; i++) {
            for (int j = 0; j <n ; j++) {

                if(arr[i][j] ==1 && house[i][j]==0){
                    // 단지 array에 1이고, 아직 count를 안한 곳에만 단지번호 매기기
                    count = 1;
                    find(i,j);
                    al.add(count);
                }
            }

        }
        Collections.sort(al);

        System.out.println(al.size());
        for (int i = 0; i <al.size() ; i++) {
            System.out.println(al.get(i));
        }
    }

    static int find (int x, int y){
        house[x][y] =1;

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

            if(nx>=0 && ny>=0 && nx<n && ny < n ){
                if(arr[nx][ny] ==1 && house[nx][ny] == 0){
                    // 배열 범위 안에서 array에는 있는데 아직 단지번호를 안매기 경우, 재귀로 돌려서
                    // 1로 다채우고 그다음 count 하나 추가.
                    find(nx, ny);
                    count++;
                }
            }

        }
        return count;
    }
}

 

 

 

 

결과 

 

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

[백준] 4962번 섬의 개수 DFS, BFS  (0) 2020.03.23
[백준] 11655번 ROT13  (0) 2020.03.21
[백준] 1991번 트리순회  (0) 2020.03.20