본문 바로가기
CS/Algorithm

[알고리즘][BOJ][2667] 단지번호 붙이기

by 별토끼. 2018. 10. 3.
반응형

[알고리즘][BOJ][2667] 단지번호 붙이기

 

 

 

 

문제

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

 

 

풀이

DFS를 이용해 탐색하며 단지의 수와 단지 내 집의 수를 구해주면 되는 문제입니다. 단지의 수를 카운팅할 때는 count변수를 두었습니다. 새로운 단지일 때, count변수를 이용하여 ArrayList에 단지를 추가해줍니다. DFS함수로 들어갔을 때, h_num의 값을 증가시켜 집의 수를 구해줍니다. 탐색을 마치고 새로운 단지를 발견했을 때, count변수를 증가시키고 반복합니다.

 

코드

package algorithm_review;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;

public class q_2667 {
    static int n;
    static int[][] area;
    static boolean[][] chk;
    static ArrayList<Integer> house_num;
    static int count;
    static int h_num;
    static int[] dx = {1, -1, 0, 0};
    static int[] dy = {0, 0, 1, -1};
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        String word = scan.nextLine();
        n = Integer.parseInt(word);
        
        area = new int[n][n];
        chk = new boolean[n][n];
        house_num = new ArrayList<>();
        for(int i=0;i<n;i++) {
            word = scan.nextLine();
            String[] arr = word.split("");
            for(int j=0;j<n;j++) {
                area[i][j] = Integer.parseInt(arr[j]);
            }
            
        }    
        count = 0;
        for(int i=0;i<n;i++) {
            for(int j=0;j<n;j++) {
                if(area[i][j]==1 && chk[i][j]==false) {
                    h_num = 0;
                    house_num.add(count);
                    dfs(i,j);
                    house_num.set(count, h_num);
                    count++;
                }
                
            }
        }
        
        System.out.println(count);
        Collections.sort(house_num);
        for(int i=0;i<house_num.size();i++) {
            System.out.println(house_num.get(i));
        }
        
    }
    
    static void dfs(int p, int q) {
        
        h_num++;
        chk[p][q] = true;
        
        for(int i=0;i<4;i++) {
            int x = p+dx[i];
            int y = q+dy[i];
            if(x<0||x>=n||y<0||y>=n) {
                continue;
            }
            if(chk[x][y]==false && area[x][y]==1) {
                dfs(x,y);
            }
        }
    }
    
    

}

 

반응형

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

[알고리즘][BOJ][1697] 숨바꼭질  (0) 2018.10.17
[알고리즘][BOJ][2563] 색종이  (0) 2018.10.16
[알고리즘][swea][1208] Flatten  (0) 2018.10.03
[알고리즘][DFS][2251] 물통  (0) 2018.09.27
[알고리즘][문자열][1120] 문자열  (1) 2018.05.04

댓글