Algorithm, boj, 2267(단지번호붙이기)

  • BFS

  • (0,0) 부터 (size,size) 까지 돌면서 방문하지 않은 집을 찾는다.
  • 집을 찾으면, 단지+1을 해주고 해당 단지의 집들을 BFS로 방문하며 집의 숫자를 구한다.
  • 틀렸다는데…왜 틀렸을까? 헝헝 ㅠㅠ
package org.baekjoon;

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

public class test2667 {

	static int[][] arr;
	static int size;
	static boolean[][] visited;

	// 점의 방향
	static int[] Dx = {-1, 1, 0, 0};
	static int[] Dy = {0, 0, -1, 1};

 	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String input;

		size = Integer.parseInt(br.readLine());
		arr = new int[size][size];

		for(int i=0; i<size; i++) {
			input = br.readLine();
			for(int j=0; j<size; j++) {
				arr[i][j] = input.charAt(j) - '0';
			}
		}

		ArrayList<Integer> houseCount = new ArrayList<Integer>();
		visited = new boolean[size][size];
		int group = 0;

		// 전체를 돌며 1인 점을 찾는다
		for (int i=0; i<size; i++) {

			for (int j=0; j<size; j++) {

				// 이미 방문한 점이라면 패스
				if (visited[i][j] == true) continue;

				// 방문하지 않은 집이라면 새로운 단지+1 , 단지내 집의 수 구하기
				if(arr[i][j] == 1) {
					// 단지 +1
					group++;
					houseCount.add(BFS(i,j));
				}
			}
		}

		// 결과 출력
		System.out.println(group);

		Collections.sort(houseCount);
		for(int e:houseCount)
			System.out.println(e);

	}

	static int BFS(int x, int y) {

		int houseCount = 0;
		Queue<dot> qu = new LinkedList<dot>();
		qu.offer(new dot (x, y));

		while (!qu.isEmpty()) {
			// 방문할 큐 맨앞 점을 하나 뽑는다.
			dot Cd = qu.poll();
			int Cx = Cd.x;
			int Cy = Cd.y;


			// 뽑힌 점의 상하좌우를 확인한다.
			for (int i=0; i<4 ;i++) {
				int Nx = Cx + Dx[i];
				int Ny = Cy + Dy[i];

				// 상하좌우의 점이 범위 내에 있는지 확인한다.
				if (0 <= Nx && Nx < size && 0 <= Ny && Ny < size) {
					// 집이 있고 방문하지 않았으면
					if (arr[Nx][Ny] == 1 && visited[Nx][Ny] == false) {
						// 방문한다
						visited[Nx][Ny] = true;
						qu.offer(new dot(Nx,Ny));
						// 집의 숫자를 세어준다.
						houseCount++;
					}
				}
			}
		}
		return houseCount;
	}
}


class dot{
	int x;
	int y;

	dot(int x, int y){
		this.x = x;
		this.y = y;
	}
}

Reference

문제로 가기 문제 풀이 참고