GitHubSeob

C++ / 백준 / 2447 / 별 찍기 - 10 본문

Baekjoon/Silver

C++ / 백준 / 2447 / 별 찍기 - 10

GitHubSeob 2021. 9. 1.

문제

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

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

문제풀이

N이 9 이상일 때 0~8의 모양이다.

먼저 N이 몇이든 (1, 1), (1, 4), (1, 7), (4, 1), (4, 4), (4, 7),...

y%3=1, x%3=1인 좌표는 공백 1칸을 출력한다.

따라서 좌표를 3으로 나눈 나머지가 1이면 공백을 출력하도록 가장 먼저 조건을 걸어둔다.

그다음은 가운데 3x3 짜리 공백을 구하는 조건을 구해야 한다.

N=9이면 (3, 3), (3, 4), (3, 5), (4, 3), (4, 4), ... (5, 5),

N=27이면 (9, 9), (9, 10), ... (10, 9), (10, 10), ... (17, 16), (17, 17)이다.

N=9이면 좌표/3%3==1일 때, N=27이면 좌표/9%3==1일 때이다.

27일 때는 좌표/9%3==1 뿐만 아니라 좌표/3%3==1인 부분도 공백을 출력해야 하므로

좌표/N%3==1이라는 조건을 걸고, N이 3 이상일 때 N을 3으로 계속 나누어 공백을 확인하는 부분을 반복해야 한다.

    else if (y / N % 3 == 1 && x / N % 3 == 1) cout << ' ';
    else if (N >= 3) Make_Star(N / 3, y, x);

방금 말한 부분을 조건식으로 세우면 이렇게 된다.

이 이외에는 모두 *을 표시하면 된다.

 

코드

#include <iostream>
using namespace std;

void Make_Star(int N, int y, int x) {
    if (y % 3 == 1 && x % 3 == 1) cout << ' ';
    else if (y / N % 3 == 1 && x / N % 3 == 1) cout << ' ';
    else if (N >= 3) Make_Star(N / 3, y, x);
    else cout << '*';
}

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

    int N = 0;
    int y = 0, x = 0;
    cin >> N;

    for (y = 0; y < N; ++y) {
        for (x = 0; x < N; ++x) {
            Make_Star(N, y, x);
        }
        cout << '\n';
    }
}