1012번 유기농배추
🅰 설계
1. 어떤 방법을 사용할 것인가?
- map을 만들고 4방향을 탐색하며 연결된 부분을 다 체크하고 답의 value를 올리는 방식을 생각할 수 있다.
- BFS : Queue에 위치를 넣으면서 방문한 map을 0으로 바꿔주면 된다.
- DFS : 재귀로 방문한 map을 0으로 바꿔주면 된다.
- DFS를 사용하기로 한다. Queue에 넣고 빼는 작업 없이 재귀로 map의 방문 체크만 하면 되기 때문에 더 간단하게 풀 수 있다.
2. 방문 체크
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(map[i][j]){
ans++;
check(i,j,map);
}
}
}
static void check(int y,int x,boolean[][] map){
map[y][x] = false;
for(int i=0;i<4;i++){
int ny = y+dy[i];
int nx = x+dx[i];
if(map[ny][nx]) check(ny,nx,map);
}
}
|
cs |
- 모든 map을 돌면서 (i,j)에 배추가 있다면 답의 value를 올리고
check(i,j,map)
을 호출하여 연결된 모든 map을 탐색해 배추를 없앤다.
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
|
import java.io.*;
import java.util.*;
public class 유기농배추 {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static StringTokenizer st;
static int[] dy={1,-1,0,0}, dx={0,0,1,-1};
public static void main(String[] args) throws IOException {
int T = Integer.parseInt(br.readLine());
for(int i=0;i<T;i++) solve();
}
static void solve() throws IOException{
int m,n,k;
st = new StringTokenizer(br.readLine());
m = Integer.parseInt(st.nextToken());
n = Integer.parseInt(st.nextToken());
k = Integer.parseInt(st.nextToken());
boolean[][] map = new boolean[n+2][m+2];
for(int i=0;i<k;i++){
st = new StringTokenizer(br.readLine());
int x,y;
x = Integer.parseInt(st.nextToken());
y = Integer.parseInt(st.nextToken());
map[y+1][x+1] = true;
}
int ans = 0;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(map[i][j]){
ans++;
check(i,j,map);
}
}
}
System.out.println(ans);
}
static void check(int y,int x,boolean[][] map){
map[y][x] = false;
for(int i=0;i<4;i++){
int ny = y+dy[i];
int nx = x+dx[i];
if(map[ny][nx]) check(ny,nx,map);
}
}
}
|
cs |
✅ 후기
간단한 DFS문제로 처음 배웠을 때 연습하기 좋은 문제였다. BFS와 DFS중 본인이 익숙한 방식으로 해결하면 될 듯 하다.
'Problem Solving > Baekjoon' 카테고리의 다른 글
[ACMICPC] 1992 . 쿼드트리 (0) | 2021.07.30 |
---|---|
[ACMICPC] 1931 . 회의실 배정 (0) | 2021.07.28 |
[ACMICPC] 1300 . K번째 수 (0) | 2021.07.24 |
[ACMICPC] 1916 . 최소 비용 구하기 (0) | 2021.07.23 |
[ACMICPC] 15684 . 사다리 조작 (0) | 2021.07.21 |