✏️ Algorithm/알고리즘 풀이

백준 2447번 - 별 찍기 - 10 (C++)

미미누 2022. 1. 2. 03:27

[문제]

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

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

[풀이]

재귀 함수로 푸는 문제이다. (0,0) 좌표에서 시작하여, N/3씩 이동한 뒤 좌표를 다시 start 함수에 넣는다. 빈 칸을 만들기 위해서 i%N/(N/3), j%N/(N/3)이 1인 경우가 빈칸으로 만들었다.

 

[코드]

#include <bits/stdc++.h>

using namespace std;

char map2[10000][10000];

void draw(int x, int y, int N)
{
    for(int i=x; i<x+N; i++)
    {
        for(int j=y; j<y+N; j++)
        {
            if(i%3 == 1 && j%3 == 1) map2[i][j] = ' ';
            
            else map2[i][j] = '*';
        }
        
    }
}

void start(int x, int y, int N)
{
    if(N == 3)
    {
        draw(x,y,N);
        return;
    }
    for(int i=x; i<x+N; i+=N/3)
    {
        for(int j=y; j<y+N; j+=N/3)
        {
            if(N>3){
                if(i%N/(N/3) != 1 || j%N/(N/3) != 1) start(i,j,N/3);
            }
                
        }
    }

    
}

int main()
{
    int N;
    cin >> N;
    memset(map2, ' ', sizeof(map2));
    start(0,0,N);
    for(int i=0; i<N; i++)
    {
        for(int j=0; j<N; j++)
        {
            cout << map2[i][j];
        }
        cout<< "\n";
    }
}