PS/BaekJoon

[BaekJoon 1012번] 유기농 배추(C++)

박땅콩 2022. 8. 5.
728x90

※주의※

저의 풀이가 정답은 아닙니다.

다른 코드가 더 효율적이거나 좋을 수 있습니다.

언제나 다른 사람의 코드는 참고만 하시기 바랍니다.

 

 

[문제 풀이 사이트]

 

 

 

1012번: 유기농 배추

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

www.acmicpc.net

 

 

[문제 설명]

 

 

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

한나가 배추를 재배하는 땅은 고르지 못해서 배추를 군데군데 심어 놓았다. 배추들이 모여있는 곳에는 배추흰지렁이가 한 마리만 있으면 되므로 서로 인접해있는 배추들이 몇 군데에 퍼져있는지 조사하면 총 몇 마리의 지렁이가 필요한지 알 수 있다. 예를 들어 배추밭이 아래와 같이 구성되어 있으면 최소 5마리의 배추흰지렁이가 필요하다. 0은 배추가 심어져 있지 않은 땅이고, 1은 배추가 심어져 있는 땅을 나타낸다.

 

 

[입력]

 

 

입력의 첫 줄에는 테스트 케이스의 개수 T가 주어진다. 그 다음 줄부터 각각의 테스트 케이스에 대해 첫째 줄에는 배추를 심은 배추밭의 가로길이 M(1 ≤ M ≤ 50)과 세로길이 N(1 ≤ N ≤ 50), 그리고 배추가 심어져 있는 위치의 개수 K(1 ≤ K ≤ 2500)이 주어진다. 그 다음 K줄에는 배추의 위치 X(0 ≤ X ≤ M-1), Y(0 ≤ Y ≤ N-1)가 주어진다. 두 배추의 위치가 같은 경우는 없다.

 

 

[출력]

 

 

각 테스트 케이스에 대해 필요한 최소의 배추흰지렁이 마리 수를 출력한다.

 

 

[입출력 예]

 

 

입력 출력
2
10 8 17
0 0
1 0
1 1
4 2
4 3
4 5
2 4
3 4
7 4
8 4
9 4
7 5
8 5
9 5
7 6
8 6
9 6
10 10 1
5 5
5
1
1
5 3 6
0 2
1 2
2 2
3 2
4 2
4 0
2

 

 

[문제 풀이]

 

쉬웠던 문제였다.

시작점을 찾기 위해 이중 for문을 사용했고 BFS 알고리즘을 사용했다. (큐를 사용)

그리고 최소 배추 지렁이의 수를 구하기 위해선 시작점을 찾을 때마다 값을  +1을 해주면 된다.

시작점을 찾을 때가 영역이 달라진다는 의미이기도 하고 영역마다 지렁이가 1마리씩 필요하기 때문이다.

 

 

[최종 코드]

 

 

[GitHub]

 

 

 

GitHub - SmallPeanutPark/BAEKJOON: Study BaekJoon for Coding Test

Study BaekJoon for Coding Test. Contribute to SmallPeanutPark/BAEKJOON development by creating an account on GitHub.

github.com

 

 

#include <string>
#include <vector>
#include <iostream>
#include <queue>
#include <utility>

using namespace std;

int dx[4] = { 1, 0, -1, 0 };
int dy[4] = { 0, 1, 0, -1 };

int main(void) {
    int T;
    cin >> T;
    for (int i = 0; i < T; ++i) {
        int M, N, K; // 가로, 세로, 배추가 심어져 있는 위치 개수
        cin >> M >> N >> K;
        int ans = 0;
        int field[51][51];
        bool visited[51][51];
        // 초기 세팅
        for (int idx = 0; idx < 51; ++idx) {
            fill(field[idx], field[idx] + 51, 0);
            fill(visited[idx], visited[idx] + 51, false);
        }

        for (int j = 0; j < K; ++j) {
            // 배추가 심어져 있는 위치를 입력
            int x, y;
            cin >> x >> y;
            field[x][y] = 1;
        }

        // 시작 위치를 찾는다.
        queue<pair<int, int>> q;
        for (int l = 0; l < M; ++l) {
            for (int ll = 0; ll < N; ++ll) {
                if ((field[l][ll] == 0) || (visited[l][ll])) continue;
                // 시작 위치 찾음(배추가 있는 영역이라는 뜻)
                q.push({ l, ll });
                visited[l][ll] = true;
                ans += 1;
                while (!q.empty()) {
                    pair<int, int> curlocation = q.front();
                    q.pop();
                    for (int k = 0; k < 4; ++k) {
                        int nx = curlocation.first + dx[k];
                        int ny = curlocation.second + dy[k];
                        if (nx < 0 || nx >= M || ny < 0 || ny >= N)  continue;
                        if ((field[nx][ny] == 0) || (visited[nx][ny])) continue;
                        q.push({ nx, ny });
                        visited[nx][ny] = true;
                    }
                }
            }
        }
        cout << ans << '\n';
    }
}

 

 

728x90

댓글