코딩테스트
[인프런 자바/java] 13. 섬나라 아일랜드 _디버깅의 눈물
디버깅의 눈물
2022. 9. 10. 22:00
체크 포인트
1. DFS(깊이 우선 탐색)을 이용하는 문제
-섬나라 아일랜드 상에 존재하는 '전체 섬의 개수'를 구하는 문제
-DFS를 이용한 완전 탐색으로 해결하도록 하였다.
2.상,하,좌,우 + 대각선 탐색
-일반적인 DFS를 이용해 푸는 문제라 딱히 특별한 점은 없었다.
// 상,하,좌,우,대각선 방향 탐색을 위한 x,y
static int[] dx = {0,0,-1,1,-1,-1,1,1};
static int[] dy = {1,-1,0,0,-1,1,-1,1};
-다른 문제와 차이점은 섬 탐색 시 기준점을 기준으로 상,하,좌,우뿐만 아니라, 대각선 부분도 탐색하는 부분이 존재했다.
풀이
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
// 정사각형 변의 길이
static int N;
// 육지와 바다를 표시해주는 지도 배열
static int[][] map;
// 해당 위치에 방문여부를 담는 배열
static boolean[][] visited;
// 상,하,좌,우,대각선 방향 탐색을 위한 x,y
static int[] dx = {0,0,-1,1,-1,-1,1,1};
static int[] dy = {1,-1,0,0,-1,1,-1,1};
// 섬 개수 카운트 변수
static int count;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
// 정사각형 변의 길이
N = Integer.parseInt(st.nextToken());
// 지도 배열 초기화
map = new int [N][N];
// 방문 배열 초기화
visited = new boolean[N][N];
// 지도 내 섬의 값 입력
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for(int j=0; j<N; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
/*
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
if(j==N-1) {
System.out.println(map[i][j] + " ");
}
else {
System.out.print(map[i][j] + " ");
}
}
}
*/
// DFS 탐색 시작 부분
for(int i=0; i<N; i++) {
for(int j=0; j<N; j++) {
// 해당 위치에 방문한 적이 없고, 해당 위치가 육지라면,
if(!visited[i][j] && map[i][j] == 1) {
DFS(i,j);
// 섬 총 개수 증가 처리
count++;
}
}
}
System.out.println(count);
}
static void DFS(int x, int y) {
// 방문 처리
visited[x][y] = true;
// 상,하,좌,우,대각선 탐색 시작
for(int i=0; i<8; i++) {
int nx = x + dx[i];
int ny = y + dy[i];
// 새로운 nx, ny가 지도 배열 내 위치하고,
if(nx>=0 && ny>=0 && nx<N && ny<N) {
// 해당 위치가 섬이고, 방문한 적이 없다면,
if(map[nx][ny]==1 && !visited[nx][ny]) {
// DFS탐색 시작
DFS(nx,ny);
}
}
}
}
} // end of Main