✏️ Algorithm/알고리즘 풀이

[BOJ 2630] 색종이 만들기 - C++

미미누 2022. 8. 9. 23:42

✅️[문제/Problem]
https://www.acmicpc.net/problem/2630

2630번: 색종이 만들기

첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.

www.acmicpc.net


✅️[풀이/Explanation]

재귀 문제이다.
재귀 문제를 풀때 baseConditon(종료 조건)과  n, n+1일때 풀이에 집중해야 한다.
종료 조건은 처음 주어진 수와 반복문 내에서 배열 값이 같지 않을때 종료하도록 한다.
재귀함수에서 n/2를 호출하여 좌표값을 부르면 된다.
Solving method is the recursive function.
when unraveling a recursive problem, we should concentrate on the base_condition and when a situation of recursive is N or N+1(that is mathematical induction). The base_condition is to cease when the first given number is not equal to a number in arrays.
By visiting n/2 in recursive function(To divide into quarter arrays), we can select a coordinate. for instance, in N is 4, (0,0) -> (2,0), etc.

✅️[코드/code]

#include <bits/stdc++.h>

using namespace std;

int arr[256][256];

int N;

int ans[2];

bool calc(int n, int x, int y){

    int start = arr[x][y];

    for(int i=x; i<x+n; i++){

        for(int j=y; j<y+n; j++){

            if(start != arr[i][j]){

                return true;

            }

        }

    }

        return false;

}

void cal(int n, int x, int y){

    

    if(calc(n, x, y) == false){

        ans[arr[x][y]]++;

        return;

    }

    for(int i=x; i<x+n; i+=(n/2)){

        for(int j=y; j<y+n; j+=(n/2)){

           cal(n/2, i, j);

        }

    }

}

int main() {

    ios::sync_with_stdio(0);

    cin.tie(0);

    

    cin >> N;

    for(int i=0; i<N; i++){

        for(int j=0; j<N; j++){

            cin >> arr[i][j];

        }

    }

    cal(N, 0, 0);

    for(int i=0; i<2; i++){

        cout << ans[i] << '\n';

    }

}

'✏️ Algorithm > 알고리즘 풀이' 카테고리의 다른 글

[BOJ 2448] 별 찍기 - C++  (0) 2022.08.11
[BOJ 2667] 단지번호붙이기 - C++  (0) 2022.08.10
2583번 영역구하기 - C++  (0) 2022.08.04
1627번 곱셈 - C++  (0) 2022.08.04
7562번 나이트의 이동 - C++  (0) 2022.08.02