1992번: 쿼드트리
첫째 줄에는 영상의 크기를 나타내는 숫자 N 이 주어진다. N 은 언제나 2의 제곱수로 주어지며, 1≤N ≤64의 범위를 가진다. 두 번째 줄부터는 길이 N 의 문자열이 N 개 들어온다. 각 문자열은 0 또는 1의 숫자로 이루어져 있으며, 영상의 각 점들을 나타낸다.
www.acmicpc.net
https://onlytrying.tistory.com/42
AOJ의 QUADTREE 문제와 유사한 형태의 문제라고 생각한다. 따라서 알고리즘도 비슷하게 구현하였다.
먼저 (startY, startX)좌표를 시작으로 N X N 크기만큼 보드값을 검사한다. 모든 값이 일치한다면 숫자 1 or 0 으로 압축할 수 있다. 값이 일치하지 않다면 N/2 크기의 보드 4개로 나누고 나눠진 보드에 대해 위와 같은 작업을 반복한다.
나눠진 보드들이 반환하는 문자열을 합치고 시작 위치에 '(', 끝 위치에 ')'을 붙여주면 원하는 결과를 출력할 수 있다.
#include <iostream>
#include <string>
#include <vector>
using namespace std;
vector<string> board;
string Solution(int N, int startY, int startX)
{
bool check = true;
for (int i = startY; i < startY+N; i++)
{
for (int j = startX; j < startX+N; j++)
{
if (board[i][j] != board[startY][startX])
{
check = false;
break;
}
}
if (!check) break;
}
if (check) return string(1,board[startY][startX]);
int nextN = N / 2;
string board1 = Solution(nextN, startY, startX);
string board2 = Solution(nextN, startY, startX + nextN);
string board3 = Solution(nextN, startY + nextN, startX);
string board4 = Solution(nextN, startY + nextN, startX + nextN);
return '(' + board1 + board2 + board3 + board4 + ')';
}
int main(void)
{
int N;
cin >> N;
for (int i = 0; i < N; i++)
{
string str;
cin >> str;
board.push_back(str);
}
cout << Solution(N, 0, 0) << endl;
return 0;
}
알고리즘 200일 프로젝트 - 38day
'알고리즘 > BOJ' 카테고리의 다른 글
백준 6236번: 용돈 관리 (0) | 2020.05.13 |
---|---|
백준 1780번: 종이의 개수 (0) | 2020.05.12 |
백준 1074번: Z (2) | 2020.05.12 |
백준 11729번: 하노이 탑 이동 순서 (0) | 2020.05.11 |
백준 2966번: 찍기 (0) | 2020.05.06 |