백준 유기농 배추 1012 C++

Jaedup·2023년 3월 14일
0

알고리즘 문제풀이

목록 보기
4/10
post-thumbnail

1012: 유기농 배추

배추를 지키기 위해 필요한 지렁이의 마리 수를 구하는 문제.

연결된 배추의 영역의 개수를 구하면 된다.

DFS로도 풀 수 있지만 BFS를 이용하여 풀어보았다.

입력으로 주어진 배추의 위치를 2차원 배열에 저장하여, 예시로 주어진 것과 같은 표를 만든다.

표의 (0,0)부터 (n-1,n-1)까지 탐색하면서 1을 만나면 BFS 함수를 실행, 탐색이 완료된 칸은 visited 배열을 업데이트 한다.

  • 이 문제의 경우 2차원 배열을 활용한 BFS이기 때문에, nx와 ny라는 변수를 만들어 상하좌우를 모두 탐색할 수 있도록 해야한다.
  • 이 때 영역의 값을 벗어나는 곳은 탐색하지 않도록 주의해야한다.

모든 좌표의 탐색을 완료하면 영역의 개수를 출력한다.

  • 같은 배추를 다시 세지 않도록 visited 배열을 업데이트 해주는 것이 중요하다.
  • 배열에 배추의 위치를 저장하는 과정에서 행렬을 헷갈리지 않게 주의해야한다.
    • 코드에서 arr[10][5]라고 하면 행이 5개, 열이 10개가 된다.
    • 반면 10X5 행렬은 행리 10개, 열이 5개이다.
    • 따라서 입력 받은 값을 저장할 때 x와 y의 값을 반대로 저장해야하고, 반복문 실행 시 n과 m의 값을 유의하여 사용 해야한다.
#include <iostream>
#include <queue>
using namespace std;

int t, m, n, k;
int arr[50][50];
bool visited[50][50];
int cnt = 0;
queue<pair<int, int>> q;

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

void init()
{
    for (int i = 0; i < 50; i++)
    {
        for (int j = 0; j < 50; j++)
        {
            arr[i][j] = 0;
            visited[i][j] = false;
        }
    }
}

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

int main()
{
    cin >> t;
    while (t > 0)
    {
        init();

        cin >> m >> n >> k;
        int a, b;
        for (int i = 0; i < k; i++)
        {
            cin >> a >> b;
            arr[b][a] = 1;
        }
        for (int x = 0; x < n; x++)
        {
            for (int y = 0; y < m; y++)
            {
                if (arr[x][y] == 1 && !visited[x][y])
                {
                    bfs(x, y);
                    cnt++;
                }
            }
        }
        t--;
        cout << cnt << endl;
        cnt = 0;
    }
    return 0;
}

0개의 댓글