백준 별 찍기-10 [C++]

Problem : 별찍기 10

유형 : 분할 정복


문제 해석

  • 별을 찍어라.
  • 크기는 3^7을 넘지 않는다.

해결 전략

  • 프랙탈 구조로 이루어진 별찍기이다.
  • 분할정복으로 해결한다.
    • 구간을 1/3씩 총 9개로 나누고, 중간 부분은 생략한다.

설계, 구현

  • base condition은 크기가 1이 된 경우로 한다.
  • 크기를 1/3으로 나눈다.
    • 큰 문제를 작은 문제로 바꾸어서, 해결한다.
      • 잘라낸 크기, 시작할 좌표 2개를 구해서 넣어준다.
    • 가운데 공간은 비워두어야 하므로 따로 처리 해준다.
      • for 문에서 i,와 ii가 1인 경우를 건너뛴다.

주의할 점

  • 없음

코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <bits/stdc++.h>
using namespace std;

const int MAX = 6600; // 6600 > pow(3,8)
bool board[MAX][MAX];

void func(int n, int x, int y) {
    if (n == 1) {
        board[x][y] = true;
        return;
    }

    int div = n / 3;
    for (int i = 0; i < 3; ++i) {
        for (int ii = 0; ii < 3; ++ii) {
            if (i == 1 and ii == 1) continue;
            func(div, x + i * div, y + ii * div);
        }
    }
}

void printAnswer(int n) {
    for (int i = 0; i < n; ++i) {
        for (int ii = 0; ii < n; ++ii) {
            if (board[i][ii]) {
                cout << "*";
            }
            else {
                cout << " ";
            }
        }
        cout << "\n";
    }
}

void solve() {
    int n;
    cin >> n;
    func(n, 0, 0);
    printAnswer(n);
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);  cout.tie(NULL);
    freopen("input.txt", "r", stdin);

    solve();

    return 0;
}

피드백

  • 분할정복 유형의 문제는 작은 문제로 쪼갰을때, 작은 문제에서 또 필요한 정보가 무엇인지를 잘 생각해보자.