🖥️ CS/Baekjoon Algorithms

#1992번 쿼드트리 (C++)

한국의 메타몽 2020. 11. 20. 10:40

링크 : www.acmicpc.net/problem/1992

 

1992번: 쿼드트리

첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1≤N ≤64의 범위를 가진다. 두 번째 줄부터는 길이 N 의 문자열이 N 개 들어온다. 각 문자열은 0 또는

www.acmicpc.net

문제를 이해하는데 시간이 다소 소요됐다.

문제 해석은 다음과 같으며, 아래의 그림을 이해하면 된다.

 

이 순서로 표기된다

 

문제 풀이는 다음과 같다.

1. 입력은 숫자가 아닌 문자로 진행된다. 

2. 문자를 그대로 받아도 되고, 숫자로 바꿔서 진행해도 된다. 

본인은 둘 다 진행했으나, 편의상 문자를 그대로 받아 진행하겠다. 

3. 재귀를 통해 1번부터 마지막 번호까지 재귀함수를 진행한다. 

4. 지정된 영역의 범위를 모두 세어봤을 때, '0'의 갯수나 '1'의 갯수가 0개일 경우 압축이 진행된다. 

5. 만약 두 종류의 갯수가 0개가 아닐 경우, 괄호를 추가해주고

영역을 네 분할로 나누어 다시 재귀함수를 호출한다.

 

#include <iostream>
#include <string>
using namespace std;

int n = 0;
char arr[65][65];
string ans = "";

void check(int starty, int startx, int endy, int endx) {
	int b = 0, w = 0; // b = 1로 표시된 구역
	for (int i = starty; i <= endy; i++) {
		for (int j = startx; j <= endx; j++) {
			if (arr[i][j] == '1') b++;
			else w++;
		}
	}
	if (b == 0 || w == 0) {
		if (b == 0) ans += "0";
		else ans += "1";
	}
	else {
		ans += "(";
		check(starty, startx, (starty+endy) / 2, (startx+endx) / 2); // 1사분면
		check(starty, (startx+endx)/2+1,(starty+endy)/2,endx); // 2사분면
		check((starty+endy)/2+1, startx, endy, (startx+endx)/2); // 3사분면
		check((starty + endy) / 2 + 1, (startx + endx) / 2 + 1, endy, endx); //4사분면
		ans += ")";
	}
}

int main() {
	ios::sync_with_stdio(NULL);
	cin.tie(NULL);
	char c;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> c;
			arr[i][j] = c;
		}
	}
	check(1, 1, n, n);
	cout << ans << "\n";
	return 0;
}

아래는 문자를 숫자로 변형, 위는 문자를 그대로 문자값으로 저장한 답변

 

문제만 잘 이해됐다면 그다지 어렵지 않다. 

#2630번 색종이 만들기의 확장판이다.

'🖥️ CS > Baekjoon Algorithms' 카테고리의 다른 글

#13460번 구슬 탈출 2 (C++)  (0) 2020.11.25
#1780번 종이의 개수 (C++)  (0) 2020.11.20
#2630번 색종이 만들기 (C++)  (0) 2020.11.19
#5430번 AC (C++)  (0) 2020.11.19
#1021번 회전하는 큐 (C++)  (0) 2020.11.18