지난번 계륵 일기에도 적었지만 하나씩 입력 받는 방법이 c++ 에서는
cin 을 통해서는 할 수 없기 때문에
scanf 를 사용해야 한다.
인데.. 그 포멧을 잘못 써서 문제 푸는데 시간이 걸렸다.
scanf("%1d", &arr[i][j]);
처럼 사용할 수 있고 string 으로 받아서 하나씩 처리해도 되긴 한다.
string s;
for(int i = 0; i < N; i++)
{
cin >> s;
for(int j = 0; j < N; j++)
{
arr[i][j] = s[i];
}
}
https://www.acmicpc.net/problem/1992
위의 문제는 처음 영역을 확인하고 계속 영역을 줄여가며 풀어야 하는 문제로
처음의 큰 문제를 작게 쪼개어 가며 구현을 하게 된다.
이처럼 문제를 푸는 방식을 분할 정복 이라고 하며 재귀함수 혹은 스택으로 구현할 수 있다.
string quard(int y, int x, int size)
{
int b = arr[y][x];
// cout << to_string(b);
if (size == 1)
return to_string(b);
string ret = "";
for (int i = y; i < y + size; i++)
{
for (int j = x; j < x + size; j++)
{
if (b != arr[i][j])
{
ret += '(';
ret += quard(y, x, size / 2);
ret += quard(y, x + size / 2, size / 2);
ret += quard(y + size / 2, x, size / 2);
ret += quard(y + size / 2, x + size / 2, size / 2);
ret += ')';
return ret;
}
}
}
return to_string(b);
}
이처럼 quard 라는 재귀함수로 처음의 사이즈의 절반씩 줄여가고 영역을 나누는 방식을 반복하여
문제를 해결하게 된다.