관리 메뉴

풀이 보관함

[C++] 백준 2447번: 별 찍기 - 10 본문

problem solving/백준

[C++] 백준 2447번: 별 찍기 - 10

viin 2022. 9. 27. 00:58

🔗 문제

2447번 - 별 찍기 - 10

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

🖍 풀이

 

조각내서 출력하면 쉬운데 출력은 한 줄 단위라 애를 엄청 썼다. 그러다가 한 셀마다 공백' '인지, '*'을 찍을지 봐주게 되었다.

 

0, 0 0, 1 0, 2
1, 0 1, 1 1, 2
2, 0 2, 1 2, 2

 

패턴은 (1) 전체가 공백인 부분과 (2) N/3 패턴 부분으로 나뉜다.

 

(1) 공백으로만 채워지는 공간은 전체 패턴을 9조각 냈을 때  (1, 1) 에 해당한다.

(2) N/3 패턴으로 채워지는 공간은 (1, 1)을 제외한 모든 부분이다. 

  • N/3 패턴 또한 (1, 1)을 제외하면 '*'로 채워지게 된다. 
  • N/3으로 나누다가 N이 1이 된다면 더 이상 나눌 수 없다는 걸 의미한다. 
    • 공백 위치도 아니고 더 이상 나눌 수도 없다면 *의 위치다.

 

💾  소스

#include <iostream>
void draw(int r, int c, int n)
{
    // 9조각 냈을 때, (1, 1) 즉, 정중앙에 있는 (r, c)는 공백
    if((r/n)%3==1 && (c/n)%3==1)
    {
        std::cout << ' ';
    }
    else
    {
    	// 더 이상 나눌 수도 없고, 공백의 자리도 아니다. 
        if(n == 1)
            std::cout << '*';
        else
            // N/3 패턴에서 공백인지 아닌지 체크
            draw(r, c, n/3);
    }
}

int main()
{
    int N=0;
    std::cin >> N;
    for(int i=0; i<N; ++i)
    {
        for(int j=0; j<N; ++j)
            draw(i, j, N);
        std::cout<<'\n';
    }
}