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

ByWindow·2022년 1월 12일
0

Algorithm

목록 보기
69/104
post-thumbnail

📝 문제

인접한 칸의 값을 읽으면서 1이면 카운트하고, 0이거나 이미 방문한 곳이라면 카운트하지 않는다.
전형적인 dfs 문제처럼 보였다.
예외처리와 범위에 주의하면서 dfs 알고리즘을 적용했다.
마지막에 오름차순으로 정렬한다는 조건을 빼먹고 있다가 몇 번 틀렸다.
문제를 잘 읽자...

📌 코드

package Baekjoon;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.StringTokenizer;

public class BOJ2667 {

  /**
   * dfs로 인접한 칸을 탐색
   */

  static int n, cnt;
  static int[][] map;
  static boolean[][] visited;
  static int[] moveR = {-1, 0, 1, 0};
  static int[] moveC = {0, 1, 0, -1};

  // dfs 탐색
  static void dfs(int r, int c){
    // already visited : skip
    if(visited[r][c]) return;
    // 0 : skip
    if(map[r][c] == 0) return;
    // if 1
    cnt++;
    visited[r][c] = true;
    for(int i = 0; i < 4; i++){
      int nr = r + moveR[i];
      int nc = c + moveC[i];
      // check range and move
      if(0<=nr && nr<n && 0<=nc && nc<n){
        dfs(nr, nc);
      }
    }
  }

  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    n = Integer.parseInt(br.readLine());
    map = new int[n][n];
    visited = new boolean[n][n];
    for(boolean[] v: visited){
      Arrays.fill(v, false);
    }

    for(int i = 0; i < n; i++){
      String str = br.readLine();
      for(int j = 0; j < n; j++){
        map[i][j] = Integer.parseInt(str.substring(j,j+1));
      }
    }
    cnt = 0;
    ArrayList<Integer> ans = new ArrayList<>();
    for(int i = 0; i < n; i++){
      for(int j = 0; j < n; j++){
        if(map[i][j] == 0 || visited[i][j]) continue;
        // not 0 and not visited : 1
        cnt = 0;
        dfs(i, j);
        ans.add(cnt);
      }
    }
    System.out.println(ans.size());
    if(ans.size() > 0){
      Collections.sort(ans);
      for(int answer: ans){
        System.out.println(answer);
      }
    } else System.out.println(0);
  }
}
profile
step by step...my devlog

0개의 댓글