코딩테스트/BOJ

[BOJ] 2667 단지번호 붙이기 - JAVA

5월._. 2022. 2. 23.
728x90

1. 문제

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

 

2667번: 단지번호붙이기

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

www.acmicpc.net

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

지도를 입력하여 단지수를 출력하고, 각 단지에 속하는 집의 수를 오름차순으로 정렬하여 출력하는 프로그램을 작성하시오.


2. 풀이

House class

static class House {
   int x, y;

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

메인함수

  • house[][]를 int형식으로 선언했다. 지금 보니까 그냥 char[][]로 했어도 됐을 것 같다.
  • 결과를 입력받을 ArrayList를 만들고 bfs를 부를 때마다 값을 저장했다.
  • 마지막으로 result를 정렬한 뒤 사이즈와 값 하나하나를 출력했다.
static int N;
static int[][] houses;
static int[][] deltas = {{0,1},{0,-1},{1,0},{-1,0}};

public static void main(String[] args) throws IOException {
   BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
   N = Integer.parseInt(in.readLine());
   houses = new int[N][N];

   for (int i = 0; i < N; i++) {
      String line = in.readLine();
      for (int j = 0; j < N; j++) {
         houses[i][j] = line.charAt(j) - '0';
      }
   }

   List<Integer> result = new ArrayList<>();

   for (int i = 0; i < N; i++) {
      for (int j = 0; j < N; j++) {
         if (houses[i][j] == 1) result.add(bfs(new House(i,j)));
      }
   }

   Collections.sort(result);
   StringBuilder sb = new StringBuilder();
   sb.append(result.size()).append("\n");

   for(int i=0;i<result.size();i++){
      sb.append(result.get(i)).append("\n");
   }

   System.out.print(sb);
}

 

탐색 - BFS이용

  • dfs보다는 bfs를 사용해보고 싶어서 골랐다. 굳이 visited 배열을 쓰지 않고 방문한 집은 0으로 바꿔줬다.
  • 가능한 집을 queue에 넣을 때마다 cnt+1을 한다. 
  • 마지막에 단지의 총 가구수인 cnt를 반환한다. 
private static int bfs(House house) {
   Queue<House> queue = new LinkedList<>();
   queue.offer(house);

   houses[house.y][house.x] = 0;
   int cnt = 1;

   while(!queue.isEmpty()){
      house = queue.poll();

      for(int d=0;d<4;d++){
         int ni = house.y+deltas[d][0];
         int nj = house.x+deltas[d][1];
         if(ni>=0 && ni<N && nj>=0 && nj<N && houses[ni][nj]==1){
            queue.offer(new House(ni,nj));
            houses[ni][nj] = 0;
            ++cnt;
         }
      }
   }
   return cnt;
}

3. 결과

대각선은 연결된 집이 아닌 걸 간과해서 틀렸다.

'코딩테스트 > BOJ' 카테고리의 다른 글

[BOJ] 2567 색종이 2 - JAVA  (0) 2022.02.23
[BOJ] 1012 유기농 배추 - JAVA  (0) 2022.02.23
[BOJ] 2108 통계학 - JAVA  (0) 2022.02.23
[BOJ] 2941 크로아티아 알파벳  (0) 2022.02.22
[BOJ] 1417 국회의원 선거 - JAVA  (0) 2022.02.22

댓글