[백준] 섬의 개수 4963번 - Java

GoshK·2022년 2월 18일
0

[백준] Java

목록 보기
48/49
post-thumbnail

[백준] 섬의 개수 4963번

나의 풀이

public class NumberOfIslands {
    static int[][] graph;
    static int w, h;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        while(true) {
            int answer = 0;
            graph = new int[50][50];
            st = new StringTokenizer(br.readLine());
            w = Integer.parseInt(st.nextToken());
            h = Integer.parseInt(st.nextToken());

            if(w == 0 && h == 0) break;

            for(int i = 0; i < h; i++) {
                st = new StringTokenizer(br.readLine());
                for(int j = 0; j < w; j++) {
                    graph[i][j] = Integer.parseInt(st.nextToken());
                }
            }

            for(int x = 0; x < h; x++) {
                for(int y = 0; y < w; y++) {
                    if(dfs(x, y) == true) {
                        answer++;
                    }
                }
            }

            sb.append(answer).append("\n");
        }

        System.out.println(sb);
    }

    private static boolean dfs(int x, int y) {
        if(x < 0 || y < 0 || x >= h || y >= w) {
            return false;
        }

        if(graph[x][y] == 1) {
            graph[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); //우하

            return true;
        }

        return false;
    }
}
  • dfs를 사용하여 접근하였다.
  • 우선 상, 하, 좌, 우 뿐 아니라 대각선의 위치도 고려해야 한다. 그리고 0 0 이 입력될 떄 까지 무한 반복을 해야 하기 때문에 while(true)로 시작하였다.
  • 반복이 한 턴 끝날 때 마다 그래프와 answer는 초기화 되야하기 때문에 그래프의 초기화를 while문 안에 두었다.
  • 만약 입력되는 w 와 h의 값 모두 0이라면 반복은 종료된다.
  • 모두 0이 아니라면 입력되는 값을 graph에 입력해준다.
  • graph를 돌면서, 좌표들을 dfs를 통해서 검증한다. dfs를 통해서 true가 리턴된다면 그 때 answer 을 1 증가시킨다.
  • dfs는 만약 입력된 좌표가 w, h의 범위를 벗어나면 false를 리턴한다.
  • 입력된 좌표의 graph 값이 0이 아닌 1이라면, 상, 하, 좌, 우 모든 대각선을 탐색하고 탐색을 마치면 true 를 리턴한다. 이 때, 탐색을 마친 좌표의 값은 0으로 바꿔주어서 중복 탐색하는 일을 없게 만들어야 한다.
  • graph의 값이 1이 아니라면 if문을 타지 않고 false를 리턴한다.
  • 해당 반복 종료 후, answer의 값을 스트링 빌더에 넣어준다.
  • 모든 반복이 종료되면, 스트링 빌더의 값을 출력해준다.

0개의 댓글