본문 바로가기
[백준]

[BaekJoon/백준] 1012번 C++

by Hevton 2021. 3. 21.
반응형

VISITED 배열을 따로 구현하신 분들이 많았는데,

이 문제에서는 딱히 구현해줄 필요 없이 기존 배열을 활용하여 VISITED 기능을 사용할 수 있다.

#include <cstdio>
#include <iostream>
#include <algorithm>

using namespace std;

int T; // 테스트 케이스
int arr[50][50]; // 논밭 최대 크기
int N, M; // 가로, 세로

int C; // 배추 수
int x, y; // 배추 위치를 위해

int total; // 전체 지렁이 갯수


// 인근 1 영역을 모두 0으로 만들어주는 함수. (재귀)
void road(int x, int y) {
    
    if(arr[x][y] == 1)
        arr[x][y] = 0;
    else
        return;
    
    if(x - 1 >= 0)
        road(x - 1, y);
    if(x + 1 <= N - 1)
        road(x + 1, y);
    if(y - 1 >= 0)
        road(x, y - 1);
    if(y + 1 <= M - 1)
        road(x, y + 1);
    
    
}


int main() {

    scanf("%d", &T);
    
    while(T--) {
        total = 0;
        scanf("%d %d %d", &N, &M, &C);
        
        while(C--) {
            scanf("%d %d", &x, &y);
            arr[x][y] = 1;
        }
        
        // 각 요소를 돌면서, 1인 경우에 road()재귀를 수행해서 인근 영역을 모두 0으로 만들어줌.
        for(int i = 0; i < N; i++) {
            for(int j = 0; j < M; j++) {
                
                // (0,0)이 1이고 (0,1)도 1이라고 봤을 때
                // (0,0)에서 if문이 시행되어 road() 재귀로 인해 (0,1)을 이미 0으로 만들어주었기에
                // 반복문에서 i = 0, j = 1이 왔을 때에 이 if문이 시행되지 않는 것.
                // 즉, 1이라면 해당자리에서 재귀 시작하여 조건상 인접의 모든 영역의 1을 0으로 처리해준 뒤 지렁이 하나 증가시키는 결과.
                if(arr[i][j] == 1) {
                    total++;
                    road(i, j);
                }
            }
        }
        printf("%d\n", total);
    }
}

 

그리고 이 문제에는 가지치기가 존재하기에 백트래킹이라고 보는 것이 맞다고 생각하는데

dfs라고 설명하시는 분들이 정말 많았다. (백준 카테고리도 dfs에 올려져있고..)

 

물론 깊이 우선 탐색이라는 의미에서는 맞긴 한데...

 

근데 두 개념이 워낙에 구분없이 혼용해서 쓰이기도 한다.

 

문제 풀이에 있어서는 이러한게 중요하지도 않지만.. 그냥 궁금해서 관련 질문을 백준에 올려봤다.

www.acmicpc.net/board/view/66010

 

반응형

'[백준]' 카테고리의 다른 글

[BaekJoon/백준] 10845번 C++  (0) 2021.03.24
[BaekJoon/백준] 1074번 C++ 분할정복  (0) 2021.03.23
[BaekJoon/백준] 10816번 C++  (0) 2021.03.21
[BaekJoon/백준] 1920번 C++  (0) 2021.03.20
[BaekJoon/백준] 1259번 C++/JAVA  (0) 2021.03.20