본문 바로가기
Algorithm/BOJ

[BOJ] 4963번 섬의 개수 java 풀이

by Ellery 2020. 11. 16.

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {
  static int w, h;
  static int[][] map = new int[51][51];
  static StringBuilder sb = new StringBuilder();
  public static void main(String[] args) throws IOException {
    BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    while (true) {
      String[] s = br.readLine().split(" "); // w,h
      w = Integer.parseInt(s[0]);
      h = Integer.parseInt(s[1]);
      if (w == 0 && h == 0) {
        System.out.println(sb);
        return;
      }

      for (int i = 0; i < h; i++) {
        String[] row = br.readLine().split(" ");
        for (int j = 0; j < w; j++) {
          map[i][j] = Integer.parseInt(row[j]);
        }
      }

      int island_count = 0;
      for (int i = 0; i < h; i++) {
        for (int j = 0; j < w; j++) {
          if (map[i][j] == 1) {
            dfs(i, j);
            island_count++;
          }
        }
      }
      sb.append(island_count + "\n");
    }
  }

  static void dfs(int x, int y) {
    if (x < 0 || y < 0 || x >= h || y >= w) {
      return;
    }
    if (map[x][y] == 0) {
      return;
    }

    map[x][y] = 0;
    dfs(x+1, y);
    dfs(x-1, y);
    dfs(x, y - 1);
    dfs(x, y + 1);
    dfs(x + 1, y + 1);
    dfs(x - 1, y - 1);
    dfs(x - 1, y + 1);
    dfs(x + 1, y - 1);
  }
}
  • 8방향으로 섬을 순회하면서 방문한 기록을 배열에 저장하면서 섬의 개수를 카운트하면 된다. DFS,BFS 모두 사용 가능하다.
  • 이 문제를 풀면서 시간이 굉장히 오래걸렸는데, X,y축과 w, h 변수가 뒤바뀌면서 답이 완전히 달라져야했지만 예제 테스트 케이스는 교묘하게 답안 출력과 같은 값을 보여줘서 이걸 알아차리는데 굉장히 오랜 시간이 걸렸다. 이런 휴먼에러를 빨리 잡아야 실력이 늘 것 같다. 앞으로는 w, h같은 익숙하지 않은 변수 대신에 m,n, i,j 를 2차원배열에서 사용해야겠다