본문 바로가기
Programming/BOJ

[C/C++] 백준 #2447 별 찍기 - 10(재귀 함수)

by 작은별하나 2023. 5. 6.
반응형

별찍기 프로그램을 작성하는 프로그래밍 언어를 배울 때, 초기에 자주 나오는 문제입니다.

일반적으로 직각삼각형, 이등변삼각형을 많이 찍습니다.  이 문제들은 피라미드 찍기라는 이름으로도 많이 나옵니다.

조금 더 가면 다이아몬드 형태도 찍을 수 있게 됩니다.

 

일반적인 별 찍기 문제는 난이도면에서 상당히 낮습니다.

 

little star

 

이번 문제는 난이도가 높은 별 찍기에 속합니다.  단순한 반복문 중복으로는 해결하기 어렵습니다.

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

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

이 문제를 풀기 위해서 저는 재귀함수를 사용했습니다.  이러한 재귀함수는 프랙탈과 같이 반복된 패턴이 크기만 다르게 찍을 때 자주 사용됩니다.

 

재귀함수를 사용하기 위해 배열로 캔버스를 만들었고, 그 결과를 출력토록 했습니다.

 

제가 작성한 소스입니다.

//------------------------------------------------
//    baekjoon #2447
//        - by Aubrey Choi
//        - created at 2019-08-01
//------------------------------------------------
#include <stdio.h>
char pic[2187][2188];

void draw(int r, int c, int n, char s)
{
    if(n==1) { pic[r][c]=s?'*':' '; return; }
    n/=3;
    draw(r, c, n, s&1);
    draw(r, c+n, n, s&1);
    draw(r, c+2*n, n, s&1);
    draw(r+n, c, n, s&1);
    draw(r+n, c+n, n, 0);
    draw(r+n, c+2*n, n, s&1);
    draw(r+2*n, c, n, s&1);
    draw(r+2*n, c+n, n, s&1);
    draw(r+2*n, c+2*n, n, s&1);
}

int main()
{
    int n;
    scanf("%d", &n);
    draw(0, 0, n, 1);
    for(int i = 0; i < n; i++)
        puts(pic[i]);
    return 0;
}
728x90

댓글