# 본인 풀이

DFS로 풀이했다. 반복문 반복자 변수명때문에 쓸데없는데 시간을 허비했다. 테스트케이스로 여러번 입출력이 이루어지는 문제는 지역변수로 풀이하는게 좋을 것 같다.

#include<bits/stdc++.h>
using namespace std;

int T;
int n, m, k;
int ret = 1;
int visited[50][50];
int a[50][50];
int dy[4] = {-1, 0, 1, 0};
int dx[4] = {0, 1, 0, -1};

void dfs(int y, int x){
    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(a[ny][nx] && visited[ny][nx] == 0){
            visited[ny][nx] = 1;
            dfs(ny, nx);
        }
    }
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> T;

    for (int i = 0; i < T; i++){
        cin >> n >> m >> k;
        ret = 0;


        // k개만큼 배추 심기
        for (int j = 0; j < k; j++){
            // ix, iy는 배추 위치
            int ix, iy;
            cin >> iy >> ix;
            a[iy][ix] = 1;
        }

        for (int j = 0; j < n; j++){
            for (int z = 0; z < m; z++){
                if(visited[j][z] || a[j][z] == 0){
                    continue;
                }
                dfs(j, z);
                ret++;
            }
        }
        cout << ret << "\n";
        fill(&a[0][0], &a[0][0] + 50 * 50, 0);
        fill(&visited[0][0], &visited[0][0] + 50 * 50, 0);
    }

    return 0;
}

# 모범 답안

로직은 차이가 없지만 코드가 전체적으로 정리되었다.

#include<bits/stdc++.h>
using namespace std;
int t, ret, m, n, k, x ,y, ny, nx;
int a[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){
    visited[y][x] = 1;
    for (int i = 0; i < 4; i++){
        ny = y + dy[i];
        nx = x + dx[i];

        if(ny < 0 || nx < 0 || ny >= n || nx >= m){
            continue;
        }
        if(a[ny][nx] && visited[ny][nx] == 0){
            dfs(ny, nx);
        }
    }
}

int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    cin >> t;

    while(t--){
        fill(&a[0][0], &a[0][0] + 51 * 51, 0);
        fill(&visited[0][0], &visited[0][0] + 51 * 51, 0);
        ret = 0;
        cin >> m >> n >> k;
        for (int i = 0; i < k; i++){
            cin >> x >> y;
            a[y][x] = 1;
        }
        for (int i = 0; i < n; i++){
            for (int j = 0; j < m; j++){
                if(a[i][j] == 1 && !visited[i][j]){
                    dfs(i, j);
                    ret++;
                }
            }
        }
        cout << ret << "\n";
    }

    return 0;
}