본문 바로가기
Programming/BOJ

백준 #1012 유기농 배추

by 작은별하나 2019. 12. 22.
반응형

텃밭에 배추가 심어져 있는데, 유기농으로 배추를 기르기 위해서 배추 흰지렁이를 풀어놓고자 합니다.  배추 흰지렁이는 배추가 모여있는 곳에는 한마리만 풀어놓아도, 인접한 배추로 옮겨다니면서 해충을 예방할 수 있습니다.

 

이 문제는 섬의 갯수 문제 등 자주 나오는 문제로, 그래프 이론 중 가장 기초적인 DFS, BFS 알고리즘을 이용해서 해결할 수 있습니다.

 

아래는 백준 사이트의 문제 링크입니다.

https://www.acmicpc.net/problem/1012

 

1012번: 유기농 배추

차세대 영농인 한나는 강원도 고랭지에서 유기농 배추를 재배하기로 하였다. 농약을 쓰지 않고 배추를 재배하려면 배추를 해충으로부터 보호하는 것이 중요하기 때문에, 한나는 해충 방지에 효과적인 배추흰지렁이를 구입하기로 결심한다. 이 지렁이는 배추근처에 서식하며 해충을 잡아 먹음으로써 배추를 보호한다. 특히, 어떤 배추에 배추흰지렁이가 한 마리라도 살고 있으면 이 지렁이는 인접한 다른 배추로 이동할 수 있어, 그 배추들 역시 해충으로부터 보호받을 수 있다. (

www.acmicpc.net

 

BFS를 이용해도 되고 DFS를 이용해도 됩니다.  둘 다 인접한 모든 곳을 다 순회할 수 있습니다.  개인적으로는 DFS를 선호합니다.  구현하는 것이 훨씬 더 간단해서요.

 

0 0 0 0 0 0 0 0 0 0
0 1 1 1 0 0 0 0 0 0
0 0 1 0 0 0 1 1 1 0
0 0 1 0 0 0 0 1 1 0
0 1 1 0 0 0 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0

 

DFS를 이용하든 BFS를 이용하든 시작하는 노드는 어떤 것이 되든 상관이 없습니다.  배열에 데이터가 담겨져 있으면, 순차적으로 검색을 해보면서 배열값이 1이 되어있는 곳에서부터 DFS를 돌면서 배열값을 1이 아닌값으로 대치하는 알고리즘을 사용합니다.  그렇게 하면, 자연스럽게 main() 함수에서 배열에 있는 1을 찾을 때마다 지렁이를 카운팅해주면 됩니다.

 

아래는 제가 짠 소스입니다.  소스는 참고용으로만 봐주세요.

//----------------------------------------------------------------------------------------
//  baekjoon #1012 - Organic Cabbage
//    - by Aubrey Choi
//    - created at 2019-08-01
//----------------------------------------------------------------------------------------
#include <stdio.h>
#include <memory.h>

void dfs(char v[], int y, int x, int n, int m)
{
  int d[4][2] = { 0, 1, 1, 0, 0, -1, -1, 0 };
  v[y*m+x] = 0;
  for(int i = 0; i < 4; i++)
  {
    int nx = x+d[i][1], ny = y+d[i][0];
    if(nx<0||nx>=m||ny<0||ny>=n||v[ny*m+nx]==0) continue;
    dfs(v, ny, nx, n, m);
  }
}

int main()
{
  int t, m, n, k, x, y;
  char v[2500];
  scanf("%d", &t);
  while(t--)
  {
    int ans = 0;
    scanf("%d%d%d", &m, &n, &k);
    memset(v, 0, m*n);
    while(k--)
    {
      scanf("%d%d", &x, &y);
      v[y*m+x] = 1;
    }
    for(int i = 0; i < m*n; i++)
    {
      if(!v[i]) continue;
      dfs(v, i/m, i%m, n, m);
      ans++;
    }
    printf("%d\n", ans);
  }
  return 0;
}
728x90

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

백준 #1016 제곱 ㄴㄴ수  (0) 2019.12.24
백준 #1015 수열 정렬  (0) 2019.12.23
백준 #1011 Fly me to the Alpha Centauri  (0) 2019.12.22
[C/C++] 백준 #1010 다리 놓기(조합)  (0) 2019.12.21
백준 #1009 분산처리  (0) 2019.12.20

댓글