ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java] 백준 4963 섬의 개수
    Programming/Algorithm 2021. 2. 23. 04:10

     

     

    문제

    섬(1)과 바다(0)로 이루어진 지도가 주어진다.

    이어져 있는 섬은 하나의 섬으로 간주할 때, 섬의 총 개수를 출력해라.

     

     

    코드

    import java.io.BufferedReader;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.LinkedList;
    import java.util.Queue;
    import java.util.StringTokenizer;
    
    public class b4963 {
        static int W, H;
        static int[][] map;
        static int SEA = 0, LAND = 1, VISITED = 2;
    
        public static void main(String[] args) throws IOException {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            StringBuilder sb = new StringBuilder();
    
            while (true) {
                StringTokenizer st = new StringTokenizer(br.readLine());
                W = Integer.parseInt(st.nextToken());
                H = Integer.parseInt(st.nextToken());
                if (W == 0) break;
    
                map = new int[H][W];
                for (int i = 0; i < H; i++) {
                    st = new StringTokenizer(br.readLine());
                    for (int j = 0; j < W; j++) {
                        map[i][j] = Integer.parseInt(st.nextToken());
                    }
                }
    
                int cnt = 0; // 섬의 개수
                for (int i = 0; i < H; i++) {
                    for (int j = 0; j < W; j++) {
                        if (map[i][j] == LAND) { // bfs로 이어져 있는 섬 체크
                            bfs(i, j);
                            cnt++;
                        }
                    }
                }
    
                sb.append(cnt).append("\n");
            }
    
            System.out.println(sb);
        }
    
        static void bfs(int x, int y) {
            // 상하좌우+대각선
            int[] dx = {-1, 1, 0, 0, -1, -1, 1, 1};
            int[] dy = {0, 0, -1, 1, -1, 1, -1, 1};
    
            Queue<int[]> queue = new LinkedList<>();
            queue.add(new int[]{x, y});
            map[x][y] = VISITED;
    
            while (!queue.isEmpty()) {
                int[] current = queue.poll();
                for (int i = 0; i < 8; i++) {
                    int nx = current[0] + dx[i];
                    int ny = current[1] + dy[i];
                    if (isRange(nx, ny) && map[nx][ny] == LAND) {// 탐색결과가 섬일 때
                        queue.add(new int[]{nx, ny});
                        map[nx][ny] = VISITED;
                    }
                }
            }
        }
    
        static boolean isRange(int x, int y) {
            if (x < 0 || x >= H || y < 0 || y >= W)
                return false;
            return true;
        }
    }
    

     

     

    채점 결과

    'Programming > Algorithm' 카테고리의 다른 글

    [Java] 백준 2178 미로 탐색  (0) 2021.02.25
    [Java] 백준 2146 다리만들기  (0) 2021.02.25
    [Java] 백준 7576 토마토  (0) 2021.02.23
    [Java] 백준 2667 단지번호붙이기  (0) 2021.02.23
    [Java] 백준 9466 텀 프로젝트  (0) 2021.02.22

    댓글

Designed by black7375.