728x90

이 문제는 전형적인 분할 정복과 재귀를 사용하여 풀이하는 문제이다. 분할 할때 '('를 출력하고 정복시 ')'를 출력해주면 된다. 이와 비슷한 문제로 백준 2630 색종이 만들기가 있다.
2630번: 색종이 만들기
첫째 줄에는 전체 종이의 한 변의 길이 N이 주어져 있다. N은 2, 4, 8, 16, 32, 64, 128 중 하나이다. 색종이의 각 가로줄의 정사각형칸들의 색이 윗줄부터 차례로 둘째 줄부터 마지막 줄까지 주어진다.
www.acmicpc.net
위의 색종이 만들기 문제의 풀이는 여기를 참고하면 된다.
다음은 이 문제 풀이이다.
#include<iostream>
#include<string>
#include<cstring>
using namespace std;
char map[64][64];
string result = "";
void solution(int x, int y, int num) // num은 분할 크기
{
char startNum = map[x][y];
for(int i = 0; i < num; i++)
{
for(int j = 0; j < num; j++)
{
if(map[x + i][y + j] != startNum)
{
result.push_back('(');
int next = num / 2;
solution(x, y, next);
solution(x, y + next, next);
solution(x + next, y, next);
solution(x + next, y + next, next);
result.push_back(')');
return;
}
}
}
result.push_back(startNum);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
memset(map, ' ', sizeof(map));
int n;
cin >> n;
for(int i = 0; i < n; i++)
{
string s;
cin >> s;
for(int j = 0; j < s.size(); j++)
{
map[i][j] = s[j];
}
}
solution(0, 0, n);
cout << result;
}
반응형
'알고리즘 > boj' 카테고리의 다른 글
BOJ 10026 적록색약 (0) | 2023.02.27 |
---|---|
BOJ 9019 DSLR (0) | 2023.02.26 |
BOJ 1389 케빈 베이컨의 6단계 법칙 (0) | 2023.02.21 |
BOJ 1107 리모컨 (0) | 2023.02.18 |
BOJ 2630 색종이 만들기 (0) | 2023.02.14 |