반응형
📖 문제
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 |
반응형
'코테 > 백준' 카테고리의 다른 글
[백준/JAVA] 17404번: RGB거리 2 (0) | 2024.04.09 |
---|---|
[백준/JAVA] 2589번: 보물섬 (0) | 2024.04.09 |
[백준/JAVA] 14502번: 연구소 (0) | 2024.04.05 |
[백준/JAVA] 16918번: 봄버맨 (0) | 2024.04.04 |
[백준/JAVA] 21609번: 상어 중학교 (1) | 2024.04.03 |