알고리즘/DFS & BFS

[백준]JAVA - 2667번: 단지번호붙이기

K.두부 2022. 9. 18. 14:37
반응형

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

 

2667번: 단지번호붙이기

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

www.acmicpc.net

풀이

이전에 풀었던 유기농 배추와 동일한 문제인데 난이도가 아주 조금 올라갔다.

아파트 단지 개수뿐만 아니라 단지 내에 몇 개의 집이 있는지를 구해야 하는 문제로 유기농 배추 문제에서 몇 가지 코드만 추가해주면 쉽게 풀 수 있다.

 

유기농 배추 문제와 달랐던 건 배열의 모양과 입력할 때이다. 예제를 살펴보면 '0110100'로 들어오는데 한 자리씩 잘라서 int형 배열에 넣어줘야 한다. 

map[i][j] = str.charAt(j) - '0';

문자열을 한자리씩 자르는 함수는 대부분 알고 있을 거라고 생각한다. charAt(index) 함수를 이용해서 한 자리씩 자르면 된다. 하지만 출력해보면 1이 아닌 49가 나오는 걸 볼 수 있다. 정수형을 int형으로 변환해서 출력하게 되면 아스키코드값으로 변환이 되기 때문이다. 이를 숫자 1로 변경시켜주기 위해 아스키코드 값이 48인 정수형 '0'을 빼줘야 한다.

 

<최종코드>

import java.io.*;
import java.util.*;

public class Main {	
    static int[][] map;
    static int[][] check;
    static int aptCnt = 0;
    public static void main(String[] args) throws IOException{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
        int N = Integer.parseInt(br.readLine());
		
        map = new int[N][N];
        check = 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';
            }
        }
		
        ArrayList<Integer> answer = new ArrayList<>();
        int cnt = 0;
        for (int i=0; i<N; i++) {
            for (int j=0; j<N; j++) {
                if (map[i][j] == 1 && check[i][j] == 0) {
                    aptCnt = 0;
                    cnt++;
                    dfs(i, j);
                    answer.add(aptCnt);
                }
            }
        }
		
        Collections.sort(answer);
        System.out.println(cnt);
        for (int i=0; i<cnt; i++) {
        System.out.println(answer.get(i));
        }
    }
	
    public static void dfs(int x, int y) {
        check[x][y] = 1;
        aptCnt++;
		
        if (x < map.length-1 && map[x+1][y] == 1 && check[x+1][y] == 0) {
            dfs(x+1, y);
        }
		
        if (x > 0 && map[x-1][y] == 1 && check[x-1][y] == 0) {
            dfs(x-1, y);
        }
		
        if (y < map[x].length-1 && map[x][y+1] == 1 && check[x][y+1] == 0) {
            dfs(x, y+1);
        }
		
        if (y > 0 && map[x][y-1] == 1 && check[x][y-1] == 0) {
            dfs(x, y-1);
        }
    }
}
반응형