[백준/C++] 2630번 색종이 만들기
2021. 2. 15. 22:08ㆍ알고리즘/분할 정복
728x90
반응형
문제: www.acmicpc.net/problem/2630
2630번: 색종이 만들기
첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.
www.acmicpc.net
문제풀이
주어진 종이가 같은 색으로 모두 칠해져 있을 때까지 종이를 4 등분한다.
재귀를 이용하여 종이가 같은 색으로 칠해져 있을 때까지 함수를 반복했다.
함수에서 기준점의 인덱스와 종이의 크기를 매개변수로 넘겨주었다.
코드
#include <iostream>
using namespace std;
int arr[129][129] = {0}; //종이의 크기는 최대 128x128
int bcnt=0; //파란색(1) 종이 조각의 개수
int wcnt=0; //하얀색(0) 종이 조각의 개수
void func(int x, int y, int N){
bool flag = true;
for(int i=x; i<x+N; i++){
for(int j=y; j<y+N; j++){
if(arr[x][y] != arr[i][j]){ //종이가 같은 색으로 채워져있지 않다면
flag = false;
break;
}
}
}
if(flag && arr[x][y] == 0){ //모두 0으로 채워져있다면
wcnt++;
}
else if(flag && arr[x][y] == 1){ //모두 1로 채워져있다면
bcnt++;
}
else{ //4등분
func(x, y, N/2);
func(x, y+N/2, N/2);
func(x+N/2, y, N/2);
func(x+N/2, y+N/2, N/2);
}
}
int main(){
ios::sync_with_stdio(false); cin.tie(nullptr);
int N;
cin>>N;
for(int i=0; i<N; i++){
for(int j=0; j<N; j++){
cin>>arr[i][j];
}
}
func(0,0,N);
cout<<wcnt<<"\n"<<bcnt;
return 0;
}
결과
728x90
반응형