BOJ

백준 1012 - 유기농 배추

yanJuicy 2019. 5. 18. 20:36
반응형

문제

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

 

1012번: 유기농 배추

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

www.acmicpc.net

끊어지지 않고 이어져있는 그래프의 수가 몇개 인지 찾는 문제이다. 즉 컴포넌트의 개수를 찾으면 된다.

 

풀이

입력받은 배추의 위치를 2차원 배열에 저장한다. 2차원 배열의 크기만큼 돌면서 1인 인덱스에서 상하좌우 방향에 1이 있는지 재귀적으로 검사한다. 검사한 곳은 0으로 바꾼다. 가장자리 부분에서도 똑같이 검사 할 수 있도록 2차원 배열의 크기를 2만큼 늘려서 가상의 가장자리를 만들어줘서 풀 수 있다

 

1. N * M 2차원 배열을 하나씩 접근해서 값이 1인지 검사한다.

2. 1이면 지렁이 수를 증가하고 그 인덱스 값을 0으로 바꾼다.

3. 상하좌우를 검사해서 1이면 0으로 바꾸고 그 자리에서 상하좌우를 검사한다.

 

코드

c++

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
76
77
78
79
80
81
82
83
84
#include <iostream>
 
using namespace std;
 
int board[52][52];
 
void dfs(int row, int col)
{
    if (board[row - 1][col] == 1)
    {
        board[row - 1][col] = 0;
        dfs(row - 1, col);
    }
 
    if (board[row + 1][col] == 1)
    {
        board[row + 1][col] = 0;
        dfs(row + 1, col);
    }
 
    if (board[row][col - 1== 1)
    {
        board[row][col - 1= 0;
        dfs(row, col - 1);
    }
 
    if (board[row][col + 1== 1)
    {
        board[row][col + 1= 0;
        dfs(row, col + 1);
    }
}
 
int main()
{
    cin.tie(0);
    ios::sync_with_stdio(false);
 
    int T;
    cin >> T;
 
    for (int i = 0; i < T; i++)
    {
        int result = 0;
 
        // 판 초기화
        for (int x = 1; x <= 50; x++)
        {
            for (int y = 1; y <= 50; y++)
            {
                board[x][y] = 0;
            }
        }
 
        // 배추 위치 입력
        int M, N, K;
        cin >> M >> N >> K;
        for (int j = 1; j <= K; j++)
        {
            int x, y;
            cin >> y >> x;
            board[x + 1][y + 1= 1;
        }
 
        // 컴포넌트의 수 검사
        for (int x = 1; x <= N; x++)
        {
            for (int y = 1; y <= M; y++)
            {
                if (board[x][y] == 1)
                {
                    result++;
                    board[x][y] = 0;
                    dfs(x, y);
                }
            }
        }
 
        cout << result << '\n';
    }
 
    return 0;
}
 
cs

 

파이썬

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
import sys 
sys.setrecursionlimit(10000)
 
def dfs(i, j, graph, n, m):
    graph[i][j] = 0
    dirs = [(-10), (10), (0-1), (01)]
    for d in dirs:
        nx = i + d[0]
        ny = j + d[1]
        if nx < 0 or nx >= n or ny < 0 or ny >= m:
            continue
 
        if graph[nx][ny] == 1:
            dfs(nx, ny, graph, n, m)
 
= int(input())
for _ in range(t):
    m, n, k = map(int, input().split())
    graph = [[0]*for i in range(n)]
    for _ in range(k):
        x, y = map(int, input().split())
        graph[y][x] = 1
 
    result = 0
    for i in range(n):
        for j in range(m):
            if graph[i][j] == 1:
                dfs(i, j, graph, n, m)
                result += 1
    print(result)
 
cs

 

반응형

'BOJ' 카테고리의 다른 글

백준 2193 - 이친수  (0) 2019.05.26
백준 1473 - 음식물 피하기  (0) 2019.05.23
백준 1629 - 곱셈  (0) 2019.05.16
백준 9465 - 스티커  (0) 2019.05.14
백준 10448 - 유레카 이론  (0) 2019.05.14