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차원배열에서 사용해야겠다
'Algorithm > BOJ' 카테고리의 다른 글
[boj]20366 - 같이 눈사람 만들래? 풀이(투포인터, 정렬) (0) | 2021.03.25 |
---|---|
[BOJ] 2667번 단지번호붙이기 Java 풀이 (0) | 2020.11.16 |
[BOJ] 2178번 미로 탐색 java 풀이 (0) | 2020.11.16 |
[BOJ] 7576번 토마토 java 풀이 (0) | 2020.11.16 |
[BOJ] 7562번 나이트의 이동 java 풀이 (0) | 2020.11.16 |