알고리즘

백준 2667번 단지번호붙이기 (JAVA)

박카스마시며코딩 2023. 12. 8. 14:22

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

 

2667번: 단지번호붙이기

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

www.acmicpc.net

 

저는 BFS를 통해 문제를 해결하였습니다.

집이 있는 곳에서 BFS를 통해 해당 구역이 몇개 있는지를 판단하였고, 이들을 모아 정렬하여 문제를 풀었습니다.

 

package BOJ.bfs;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;

public class BOJ_2667 {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());
        int[][] map = new int[n][n];
        for(int i = 0 ; i < n ; i++){
            String command = br.readLine();
            for(int j = 0 ; j < n ; j++){
                map[i][j] = command.charAt(j)-'0';
            }
        }

        boolean[][] visited = new boolean[n][n];
        List<Integer> list = new LinkedList<>();
        for(int i = 0 ; i < n ; i++){
            for(int j = 0 ; j < n ; j++){
                if(!visited[i][j] && map[i][j] != EMPTY){
                    list.add(cal(i,j,map,visited,n));
                }
            }
        }
        Collections.sort(list);
        System.out.println(list.size());
        for(int num : list){
            System.out.println(num);
        }
    }
    private static final int[] DY = {-1,0,1,0};
    private static final int[] DX = {0,1,0,-1};
    private static final int EMPTY = 0;
    private static int cal(int y, int x, int[][] map, boolean[][] visited,int n) {
        visited[y][x] = true;
        Queue<int[]> q = new LinkedList<>();
        q.offer(new int[]{y,x});
        int cnt = 0;
        while(!q.isEmpty()){
            int[] now = q.poll();
            cnt++;
            for(int i = 0 ; i < 4 ; i++){
                int ny = now[0] + DY[i];
                int nx = now[1] + DX[i];
                if(ny < 0 || ny >= n || nx < 0 || nx >= n || visited[ny][nx] || map[ny][nx] == EMPTY){
                    continue;
                }
                visited[ny][nx] = true;
                q.offer(new int[]{ny,nx});
            }
        }
        return cnt;
    }
}

'알고리즘' 카테고리의 다른 글

백준 1914번 하노이 탑 (JAVA)  (1) 2023.12.10
백준 1253번 좋다 (JAVA)  (0) 2023.12.09
백준 10162번 전자레인지 (JAVA)  (1) 2023.12.07
백준 수들의 합5 (JAVA)  (2) 2023.12.06
백준 1010번 다리 놓기 (JAVA)  (0) 2023.12.05