문제 설명

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

 

1012번: 유기농 배추

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

www.acmicpc.net

배추가 심어져있는 곳은 1, 배추가 심어져 있지 않은 곳은 0으로 표시가 되어있는 땅이 있다

배추흰지렁이는 배추를 해충으로부터 보호하고, 인접해있는 다른 배추로도 이동할 수 있다

이따 필요한 총 지렁이의 개수 구하기

 

문제 풀이법

배추흰지렁이의 개수를 구한다는 뜻은, 배추가 이어져서 심어져있는 곳의 개수를 구하라는 말과 같다

 

모든 지점을 방문하는 문제이기에 bfs, dfs 모두 사용하여 문제를 풀 수 있다

 

땅을 나타내는 배열 arr, 방문했는지 나타내는 배열 visited이 필요하다

모든 배열을 0으로 초기화 한 후, 배추가 심어져 있는 위치의 개수 k만큼 위치를 받아서 해당 위치에 배추가 있다는 표시로 arr[y][x] = 1로 체크해준다 

 

이후 (0,0)부터 (n, m)번동안 검사를 하면서 배추가 있는 곳인 arr[y][x] == 1 이면서 visited[y][x] == 0인 곳에만 bfs/dfs를 돈다

총 bfs/dfs가 돈 횟수를 센 뒤 출력한다

 

위의 동작을 테스트 케이스 t번동안 반복한다

 

소스 코드

bfs

#include <iostream>
#include <queue>
#include <utility>

using namespace std;

int t, n, m, k;
int arr[51][51];
int visited[51][51];

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


void bfs(int y, int x)
{
    visited[y][x] = 1;
    
    queue<pair<int, int>> q;
    q.push({y, x});
    
    while (!q.empty())
    {
        int yy = q.front().first;
        int xx = q.front().second;
        
        q.pop();
        for (int i = 0; i < 4; i++)
        {
            int ny = yy + dy[i];
            int nx = xx + dx[i];
            
            if (ny < 0 || nx < 0 || ny >= n || nx >= m)
                continue;
            if (arr[ny][nx] == 0 || visited[ny][nx] == 1)
                continue;
                
            q.push({ny, nx});
            visited[ny][nx] = 1;
        }
    }
}

int main()
{
    cin >> t;
    
    while (t--)
    {
        cin >> m >> n >> k;
    
        for (int i = 0; i < n; i++)
        {
            fill(arr[i], arr[i] + m, 0);
            fill(visited[i], visited[i] + m, 0);
        }

        for (int i = 0; i < k; i++)
        {
            int x, y;
            cin >> x >> y;
            arr[y][x] = 1;
        }
    
        int cnt = 0;
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (arr[i][j] == 1 && visited[i][j] == 0)
                {
                    bfs(i, j);
                    cnt++;
                }
            }
        }
        printf("%d\n", cnt);
    }
    return 0;
}

 

dfs

#include <iostream>

using namespace std;

int t, n, m, k;
int arr[51][51];
int visited[51][51];

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


void dfs(int y, int x)
{
    if (visited[y][x] == 1)
        return ;
        
    visited[y][x] = 1;
    

    for (int i = 0; i < 4; i++)
    {
        int ny = y + dy[i];
        int nx = x + dx[i];
            
        if (ny < 0 || nx < 0 || ny >= n || nx >= m)
            continue;
        if (arr[ny][nx] == 0 || visited[ny][nx] == 1)
            continue;
        dfs(ny, nx);
    }
}

int main()
{
    cin >> t;
    
    while (t--)
    {
        cin >> m >> n >> k;
    
        for (int i = 0; i < n; i++)
        {
            fill(arr[i], arr[i] + m, 0);
            fill(visited[i], visited[i] + m, 0);
        }

        for (int i = 0; i < k; i++)
        {
            int x, y;
            cin >> x >> y;
            arr[y][x] = 1;
        }
    
        int cnt = 0;
    
        for (int i = 0; i < n; i++)
        {
            for (int j = 0; j < m; j++)
            {
                if (arr[i][j] == 1 && visited[i][j] == 0)
                {
                    dfs(i, j);
                    cnt++;
                }
            }
        }
        printf("%d\n", cnt);
    }
    return 0;
}

'Algorithm Study' 카테고리의 다른 글

[백준] 10026 적록색약  (0) 2023.03.17
[백준] 7562 나이트의 이동  (0) 2023.03.13
[백준] 2667 단지번호붙이기  (0) 2023.03.13
[백준] 12851 숨바꼭질 2  (0) 2023.03.10
[백준] 1697 숨바꼭질  (0) 2023.03.10
복사했습니다!