코테/백준

[백준/JAVA] 4963번: 섬의 개수

imname1am 2024. 4. 8. 21:51
반응형

📖 문제

 

4963번: 섬의 개수

입력은 여러 개의 테스트 케이스로 이루어져 있다. 각 테스트 케이스의 첫째 줄에는 지도의 너비 w와 높이 h가 주어진다. w와 h는 50보다 작거나 같은 양의 정수이다. 둘째 줄부터 h개 줄에는 지도

www.acmicpc.net

 

 

💡  풀이 방식

• BFS

 

w와 h가 0이 아닐 때만 아래와 같이 진행한다.

 

1. 격자의 값을 입력받는다.2. 모든 점을 탐색하며 방문하지 않은 땅에 대해 BFS 탐색을 실행하고, 섬 개수를 증가시킨다.  - BFS 탐색: 격자 범위를 벗어나지 않고, 방문한 적 없고, 땅(1)인 값에 대해 8방향 탐색 수행 (상하좌우 + 대각선 4방향) 3. 구한 섬 개수를 출력한다.

 

 

🔺 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
import java.util.*;
import java.io.*;
 
public class Main {
    static int[] dx = {-1,1,0,0-1,-1,1,1}; // 8방향 탐색 (상하좌우 + 대각선)
    static int[] dy = {0,0,-1,1-1,1,-1,1};
    
    static int w,h;
    static int[][] map;
    static boolean[][] visited;
    static StringBuilder sb = new StringBuilder();
    
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        
        while(true) {
            st = new StringTokenizer(br.readLine(), " ");
            
            w = Integer.parseInt(st.nextToken());   // 너비 = 열
            h = Integer.parseInt(st.nextToken());   // 높이 = 행
            
            if(w == 0 && h == 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());
                }
            }
            
            visited = new boolean[h][w];
            int cnt = 0;
            
            for(int i = 0 ; i < h ; i++) {
                for(int j = 0 ; j < w ; j++) {
                    if(!visited[i][j] && map[i][j] == 1) {  // 1: 땅
                        bfs(i,j);
                        cnt++;
                    }
                }
            }
            
            sb.append(cnt).append("\n");
        }
        
        System.out.println(sb.toString());
    }
    
    private static void bfs(int x, int y) {
        Queue<int[]> q = new ArrayDeque<>();
        q.add(new int[] {x, y});
        visited[x][y] = true;
        
        while(!q.isEmpty()) {
            int[] now = q.poll();
            
            for(int d = 0 ; d < 8 ; d++) {
                int nx = now[0+ dx[d];
                int ny = now[1+ dy[d];
                
                if(nx < 0 || nx >= h || ny < 0 || ny >= w)  continue;
                
                if(!visited[nx][ny] && map[nx][ny] == 1) { // 방문하지 않은 땅 걸으러 가기
                    visited[nx][ny] = true;
                    q.add(new int[] {nx, ny});   
                }
            }
        }
    }
}
 
cs

 

 

 

➕ 다른 풀이 방식

DFS로도 풀 수 있다.

 

[DFS] 백준 - 4963번: 섬의 개수 Java 풀이

[공부용이기 때문에 코드가 깔끔하지 않을 수 있습니다!] 문제는 맵 안에 섬이 있는데 사람은 대각선으로 된 섬을 건너갈 수 있고 이렇게 건너갈 수 있는 섬들이 총 몇 개인가를 세는 것이다. 위

9hyuk9.tistory.com


 

 

1회독 2회독 3회독 4회독 5회독
V        
반응형