백준 Baekjoon

[C언어] 백준 1012 : 유기농 배추

sujo 2021. 1. 19. 12:56

백준 1012 : 유기농 배추

 

문제 링크

www.acmicpc.net/problem/1012

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 

www.acmicpc.net

 

 

문제 내용

(요약) 고르지 못한 배추밭에 해충 방지에 효과적인 배추흰지렁이를 구입하고자 한다. 이 지렁이는 배추 근처에 서식하며 해충을 잡아먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다.(상하좌우에 배추가 위치한 경우 인접해있다고 간주한다.)

 

이때, 배추밭에 필요한 최소 배추흰지렁이 마리 수를 구하라.

 

 

Idea

깊이우선탐색(dfs)를 사용하여 배추가 서로 인접해있는지 확인하였다.

알고리즘은 아래와 같다.

 

  1. 해당 좌표가 '1'이라면 dfs를 호출하여 인접한 배추를 탐색한다.
  2. 상하좌우를 탐색하며 방문한 곳은 '0'으로 바꿔준다.
  3. 상하좌우가 모두 '0'이라면 dfs를 탈출한다.
  4. 모든 좌표가 '0'이 될 때까지 1~3을 반복한다.

 

이 dfs는 한번 탐색을 시작하면 인접한 배추들을 모두 탐색하고 이 재귀함수를 탈출한다.

따라서, 최소 배추흰지렁이 수는 처음 dfs를 호출하는 수와 같다.

 

 

Code

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
#include <stdio.h>
#include <string.h>
 
int field[50][50], m, n;
 
int dfs(int x, int y) {
    //방문한 곳은 0으로 바꾸기
    field[x][y] = 0;
 
    //상하좌우로 탐색
    if (x + 1 < m && field[x + 1][y] == 1) dfs(x + 1, y);
    if (x - 1 >= 0 && field[x - 1][y] == 1) dfs(x - 1, y);
    if (y + 1 < n && field[x][y + 1== 1) dfs(x, y + 1);
    if (y - 1 >= 0 && field[x][y - 1== 1) dfs(x, y - 1);
    return 0;
}
 
int main() {
    int T;
    scanf("%d"&T);
 
    int k, x, y, cnt;
    for (int test_case = 0; test_case < T; test_case++) {
        //배열 초기화
        memset(field, 0sizeof(field));
        scanf("%d %d %d"&m, &n, &k);
 
        //배추위치
        while (k--) {
            scanf("%d %d"&x, &y);
            field[x][y] = 1;
        }
 
        //필요한 지렁이 수 구하기
        cnt = 0;
        for (int i = 0; i < m; i++) {
            for (int j = 0; j < n; j++) {
                //배추가 있는 곳만 dfs 실행
                if (field[i][j] == 1) {
                    dfs(i, j);
                    cnt++;
                }
            }
        }
 
        //결과 출력
        printf("%d\n", cnt);
    }
    return 0;
}
cs

 

 

 

 

'백준 Baekjoon' 카테고리의 다른 글

[C언어] 백준 3040 : 백설 공주와 일곱 난쟁이  (0) 2021.02.03
[C언어] 백준 1074 : Z  (0) 2021.01.25
[C++] 백준 1966 : 프린터 큐  (0) 2021.01.07
[C++] 백준 2293 : 동전 1  (0) 2020.12.22
[C++] 백준 11399 : ATM  (0) 2020.12.14