Study with Me!
Seongmo
Study with Me!
전체 방문자
오늘
어제
  • Computer (126)
    • Computer Science (61)
      • Data Structure (51)
      • Algorithm (6)
      • 선형대수 with C++ (4)
    • Arm Architecture (1)
      • Register (0)
      • Assembly Instruction (1)
    • Linux (30)
      • Linux Kernel (4)
      • 라이브러리 함수 구현하기 (0)
      • 쉘, 쉘 명령어 구현하기 (15)
      • Ubuntu (11)
    • AWS (3)
    • Baekjoon (18)
    • Tools (6)
      • Git & Github (5)
      • Vim (1)
    • 개발 환경 (7)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • STL

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
Study with Me!

Seongmo

[C/C++] 백준 1992번 - 쿼드트리
Baekjoon

[C/C++] 백준 1992번 - 쿼드트리

2023. 8. 1. 22:14

 

1992번: 쿼드트리

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

www.acmicpc.net

이 문제는 사각형을 같은 색으로만 구성된 작은 사각형이 될 때까지 네 등분하는 문제이다.

분할 정복의 방법으로 해결할 수 있다.

처음 상황에서는 분할을 해야 하기 때문에 괄호를 출력한다.

이 경우 3번째 사각형은 분할을 할 필요가 없으므로 괄호는 출력하지 않고 현재 사각형의 색만 출력한다.

나머지 사각형은 분할을 해야하므로 괄호를 출력하고 서브 사각형으로 넘어간다.

 

이 과정을 사각형의 크기가 1이 될 때까지 재귀적으로 분할하면 된다.

#include <iostream>
#include <string>
using namespace std;
#define endl '\n'
#define SIZE 65
#define WHITE 0
#define BLACK 1

int N;
int map[SIZE][SIZE];

void initInput() {
    cin >> N;
    for (int i = 0; i < N; i++) {
        string input; cin >> input;
        for (int j = 0; j < N; j++)
            map[i][j] = input[j] - '0';
    }
}

void divide(int y, int x, int size) {
    if (size == 1) {
        cout << map[y][x];
        return;
    }

    int nSize = size / 2;
    bool flag = 1;
    int curColor = (map[y][x] == WHITE ? WHITE : BLACK);
    for (int i = y; i < y + size; i++) {
        for (int j = x; j < x + size; j++) {
            if (curColor != map[i][j]) {
                flag = 0;
                break;
            }
        }
    }
    if (flag) {
        cout << curColor;
        return ;
    }

    cout << '(';
    divide(y, x, nSize);
    divide(y, x + nSize, nSize);
    divide(y + nSize, x, nSize);
    divide(y + nSize, x + nSize, nSize);
    cout << ')';
}

void solve() {
        divide(0, 0, N);
}

int main(void)
{
    cout.tie(NULL); cin.tie(NULL); ios_base::sync_with_stdio(false);
    initInput();
    solve();

    return 0;
}
저작자표시 (새창열림)

'Baekjoon' 카테고리의 다른 글

[C/C++] 백준 1406번 - 에디터  (0) 2023.08.02
[C/C++] 백준 10799번 - 쇠막대기  (0) 2023.08.01
[C/C++] 백준 11497번 - 통나무 건너뛰기  (0) 2023.05.31
[C/C++] 백준 2003번 - 수들의 합 2  (0) 2023.05.29
[C/C++] 백준 1021번 - 회전하는 큐  (0) 2023.05.28
    'Baekjoon' 카테고리의 다른 글
    • [C/C++] 백준 1406번 - 에디터
    • [C/C++] 백준 10799번 - 쇠막대기
    • [C/C++] 백준 11497번 - 통나무 건너뛰기
    • [C/C++] 백준 2003번 - 수들의 합 2
    Study with Me!
    Study with Me!
    Study with Me!

    티스토리툴바