| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 1 | 2 | 3 | ||||
| 4 | 5 | 6 | 7 | 8 | 9 | 10 |
| 11 | 12 | 13 | 14 | 15 | 16 | 17 |
| 18 | 19 | 20 | 21 | 22 | 23 | 24 |
| 25 | 26 | 27 | 28 | 29 | 30 | 31 |
Tags
- HANBIT Academy
- 알고리즘
- The Elements of Computing Systems 2/E
- cyphenengine
- Noam Nisan
- 이득우의 게임수학
- 박기현
- https://insightbook.co.kr/
- 생능출판
- 잡생각 정리글
- 주우석
- 전공자를 위한 C언어 프로그래밍
- (주)책만
- 메타버스
- 밑바닥부터 만드는 컴퓨팅 시스템 2판
- C
- booksr.co.kr
- 김진홍 옮김
- 백준
- hanbit.co.kr
- 일기
- C++
- BOJ
- C#
- 데이터 통신과 컴퓨터 네트워크
- 게임 수학
- 이득우
- 입출력과 사칙연산
- JavaScript
- unity6
Archives
- Today
- Total
cyphen156
백준-분할 정복 1992 쿼드트리 본문
이차원 배열에서 데이터들이 한곳에 많이 몰려있다면 쿼드트리라는 데이터 구조를 통해 압축하여 표현할 수 있다.
사각형 압축이 진행되며, 앞서 풀었던 4분할 분할 정복 기법이 사용된다.
(0, (0011)(0(0111)01), 1)

제약사항
- N is a 2 ** K
- 1 <= N < 65
- 0 is white (false)
- 1 is black (true)
주의 사항
없다.
CPP풀이
쿼드트리_1992.cpp
/**
* 백준 쿼드트리_1992
* 이차원 배열에서 데이터들이 한곳에 많이 몰려있다면 쿼드트리라는 데이터 구조를 통해 압축하여 표현할 수 있다.
* 사각형 압축이 진행되며, 앞서 풀었던 4분할 분할 정복 기법이 사용된다.
* (0, (0011)(0(0111)01), 1)
*
* 제한사항
*****************************************
* N is a 2 ** K *
* 1 <= N < 65 *
* 0 is white (false) *
* 1 is black (true) *
*****************************************
*
*
*
* 주의
* 없다.
*
* 풀이시간 (문제 해석 + 구현)
* 5 + 10분
*/
#include <iostream>
#define MAX_SIZE 65
using namespace std;
static int board[MAX_SIZE][MAX_SIZE] = { 0 };
static int N;
void DivideAndConquer(int startX, int startY, int checkSize);
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> N;
for (int i = 0; i < N; ++i)
{
string str;
cin >> str;
for (int j = 0; j < N; ++j)
{
board[i][j] = str[j] - '0';
}
}
DivideAndConquer(0, 0, N);
cout << '\n';
return 0;
}
void DivideAndConquer(int startX, int startY, int checkSize)
{
int base = board[startX][startY];
bool isSame = true;
for (int i = 0; i < checkSize; ++i)
{
for (int j = 0; j < checkSize; ++j)
{
if (board[startX + i][startY + j] != base)
{
isSame = false;
break;
}
}
if (!isSame)
{
break;
}
}
if (isSame)
{
cout << base;
}
else
{
int newCheckSize = checkSize / 2;
cout << "(";
DivideAndConquer(startX, startY, newCheckSize);
DivideAndConquer(startX, startY + newCheckSize, newCheckSize);
DivideAndConquer(startX + newCheckSize, startY, newCheckSize);
DivideAndConquer(startX + newCheckSize, startY + newCheckSize, newCheckSize);
cout << ")";
}
};
모든 예제 코드의 소스파일은 제 개인 깃허브 레포지토리에 있습니다.
Workspace/알고리듬 풀이 at main · cyphen156/Workspace
Studying . Contribute to cyphen156/Workspace development by creating an account on GitHub.
github.com
'컴퓨터공학 > 알고리듬 풀이' 카테고리의 다른 글
| 백준-분할 정복 1629 곱셈 (1) | 2025.08.07 |
|---|---|
| 백준-분할 정복 1780 종이의 개수 (0) | 2025.08.07 |
| 백준-분할 정복 2630 색종이 만들기 (1) | 2025.08.06 |
| 백준-그리디 알고리즘 1 13305 주유소 (2) | 2025.08.06 |
| 백준-그리디 알고리즘 1 1541 잃어버린 괄호 (4) | 2025.08.05 |
