정화 코딩

[C++] 별 찍기 - 11 (백준 2448번) 본문

PS

[C++] 별 찍기 - 11 (백준 2448번)

jungh150c 2024. 11. 23. 21:51

https://www.acmicpc.net/problem/2448

 

#include <iostream>
#include <vector>
#include <queue>
using namespace std;

int n;
vector<vector<char>> ans;

void recur(int si, int ni, int sj, int nj) {
    if (ni == 3) {
        ans[si][sj + 2] = '*';
        ans[si + 1][sj + 1] = '*';
        ans[si + 1][sj + 3] = '*';
        ans[si + 2][sj] = '*';
        ans[si + 2][sj + 1] = '*';
        ans[si + 2][sj + 2] = '*';
        ans[si + 2][sj + 3] = '*';
        ans[si + 2][sj + 4] = '*';
        return;
    }
    recur(si, ni / 2, sj + nj / 4 + 1, nj / 2);
    recur(si + ni / 2, ni / 2, sj, nj / 2);
    recur(si + ni / 2, ni / 2, sj + nj / 2 + 1, nj / 2);
}

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);

    cin >> n;
    ans = vector<vector<char>>(n, vector<char>(2 * n - 1, ' '));
    recur(0, n, 0, 2 * n - 1);

    for (int i = 0; i < n; i++) {
        for (int j = 0; j < 2 * n - 1; j++) {
            cout << ans[i][j];
        }
        cout << '\n';
    }
}

모양부터가 재귀임을 알려주고 있다. ans라는 2차원 char배열을 선언하여 전부 ' '(공백)으로 초기화하고 재귀함수를 호출하며 칸을 채웠다. 세로 길이가 3인 삼각형까지 쪼갰다면 모양에 맞춰 '*'(별)을 채우고 종료한다. (AC)

 

Comments