반응형
이 문제는 dfs를 이용하여 연결되어 있는 땅들을 확인하여 섬의 개수를 세는 문제입니다.
이 문제를 푸는 과정을 그림을 통해 보여드리도록 하겠습니다.
아래의 그림은 문제에 나와있는 예시입니다.
이제 이 그림에서 섬이 몇 개가 있는지를 찾아보겠습니다.
우선 초록색으로 표시된 땅 주변에 연결된 땅들을 찾아서 하나의 섬으로 묶어보겠습니다.
위의 그림과 같은 순서로 섬 하나가 만들어졌습니다.
이제 연결된 땅이 없으므로 떨어져 있는 섬들을 찾아보겠습니다.
노란색으로 표시된 땅 근처에도 연결된 땅이 없기 때문에 섬 하나가 또 완성되었습니다.
파란색으로 표시된 땅 주변의 땅들을 탐색해보도록 하겠습니다.
이제 더 이상 탐색하지 않은 땅이 없습니다.
따라서 이 지도에서 섬의 개수는 3개입니다.
이제 코드를 보여드리도록 하겠습니다.
import java.io.*;
import java.util.*;
public class Main {
static int row, col;
static int[][] rowCol;
static boolean[][] visited;
static int[] dr = {1, 1, 1, -1, -1, -1, 0, 0};
static int[] dc = {-1, 0, 1, -1, 0, 1, 1, -1};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuffer sb = new StringBuffer();
while (true) {
int cnt = 0;
StringTokenizer st = new StringTokenizer(br.readLine());
col = Integer.parseInt(st.nextToken());
row = Integer.parseInt(st.nextToken());
if (col == 0 && row == 0)
break;
rowCol = new int[row][col];
visited = new boolean[row][col];
for(int i = 0; i<row; i++){
st = new StringTokenizer(br.readLine());
for(int j = 0; j<col; j++)
rowCol[i][j] = Integer.parseInt(st.nextToken());
}
for(int i = 0; i<row; i++)
for(int j = 0; j<col; j++)
if(rowCol[i][j] == 1 && !visited[i][j]){
search(i, j);
cnt++;
}
sb.append(cnt).append("\n");
}
System.out.print(sb);
}
static void search(int r, int c){
visited[r][c] = true;
for(int i = 0; i<8; i++){
int dR = r + dr[i];
int dC = c + dc[i];
if(dR<0||dC<0||dR>=row||dC>=col)
continue;
if(rowCol[dR][dC] == 1 && !visited[dR][dC])
search(dR, dC);
}
}
}
반응형
'알고리즘 > 깊이 우선 탐색(dfs)' 카테고리의 다른 글
백준 1707번 : 이분 그래프 java (0) | 2022.06.30 |
---|---|
백준 1987번 : 알파벳 java (0) | 2022.06.17 |
백준 1967번 : 트리의 지름 java (0) | 2022.06.08 |
백준 17070번 : 파이프 옮기기 1 java (0) | 2022.06.06 |
백준 1182번 : 부분수열의 합 java (0) | 2022.06.06 |
댓글