‡ CODING TEST STUDY ‡/º 백준

[백준 2630번 C++] 색종이 만들기

Trudy | 송연 2023. 9. 21. 16:38

2630번: 색종이 만들기 (acmicpc.net)

 

2630번: 색종이 만들기

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

www.acmicpc.net


#include <iostream>

using namespace std;

int arr[128][128];
int white =0; 
int blue = 0;

void slice(int start_col, int start_row, int size){
    int f = arr[start_col][start_row];
    
    for(int i=start_col; i<start_col+size; i++){
        for(int j=start_row; j<start_row+size; j++){
            if(f != arr[i][j] ) {
                slice(start_col, start_row, size/2);
                slice(start_col, start_row+size/2, size/2);
                slice(start_col+size/2, start_row, size/2);
                slice(start_col+size/2, start_row+size/2, size/2);
                return;
            }
            
        }
    }
    
    if(f == 0) {
        white++;
        return;
    }
    
    else if( f == 1) {
        blue++;
        return;
    }
}

int main()
{
    int n;
    cin >> n;
    
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            cin >> arr[i][j];
        }
    }
    
    slice(0, 0, n);
    
    cout << white << "\n";
    cout << blue << "\n";
    
    return 0;
}

아무리 봐도 문제점을 모르겠어요

출력이 이렇게 나와요...

 

...

와 할렐루야

진짜 엄청 고민을 많이 했는데요....

slice 재귀 부를때

 

slice(start_col+size/2, start_row, size/2);
slice(start_col+size/2, start_row+size/2, size/2);

이거 두개를 복붙하고 똑같이 쓴 거 있죠..

 

발견하고 수정하니 맞았네요

 

..^^v