💻 OnlineJudge/Baekjoon

[백준 / BOJ] C++ 2448 별찍기 - 11

스쳐가는비 2022. 12. 7. 19:51

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

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (0 ≤ k ≤ 10, k는 정수)

www.acmicpc.net

풀이

이것저것 해보다가 결국 끼워맞추기를 시작한 문제..

반복되는 문양을 vector 배열에 넣어준다. 이후에는 코드에서 알 수 있듯.. 끼워맞춰서 출력만 되도록하였다.

 

이해를 돕기위해 아래 이미지를 참조하자.

반복되기 이전 공백이 3개씩 들어가며, 그 공백의 갯수는 2^n개로 알 수가 있다.

입력값이 3 * 2^k 이기 때문에 유추할 수 있다.

앞에 공백 "   "을 채워주고 별 그린 이후 이후 공백 "   "을 채워준다.

 

아래 코드를 참조하자.

 

Code ( C++ )

#include <iostream>
#include <cmath>
#include <vector>

using namespace std;

vector<string> star;
int n;

void make_star(int shift, vector<string>& star) 
{
    int c = star.size();
    for (int i = 0; i < c; i++) {
        star.push_back(star[i] + star[i]);
        string tmp;
        for (int j = 0; j < shift; j++)
            tmp += "   ";
        tmp += star[i];
        for (int j = 0; j < shift; j++)
            tmp += "   ";
        star[i] = tmp;
    }
}

int main() 
{
    ios::sync_with_stdio(false);
    cout.tie(NULL);

    // 반복되는 별 넣기
    star.push_back("  *   ");
    star.push_back(" * *  ");
    star.push_back("***** ");

    cin >> n;

    // N == 3 * 2^k , k값 구해서 반복시키기
    int k = log(n / 3) / log(2);

    // 값 vector에 넣기
    for (int i = 0; i < k; i++) 
    {
        make_star(int(pow(2, i)), star);
    }

    for (int i = 0; i < n; i++) 
    {
        cout << star[i] << endl;
    }
}