Algorithm

[백준 2447] 별찍기(재귀) 문제이해 / 풀이 / 코드

PIYA 2022. 6. 13.

접근방법

기본적으로 입력 N 사이즈만큼 문양이 찍힌다는것을 알아야한다.
즉 N==27이면 가로27, 세로27 사이즈의 문양이 찍힌다.
N회 반복의 for문을 두 번 중첩하고, 개행문자를 찍어줘야 하는것이 문제의 출발점이다.
별 찍는 함수에는 좌표와 입력값 N을 같이 넘긴다.

함수에서는 divide-and-conquer 방법을 사용하여 별을 찍을지, 말지를 결정한다.
n==1일 때까지 재귀호출을 하며 %3 연산을 취했을 때 i와 j가 1이 되는 경우에만 공백을 찍고,
이 조건에 걸리지 않았을 경우인데 n==1일 경우에는 별을 찍고 끝낸다.

소스코드

#include<cstdio>
void recur(int i, int j, int n) {
    if((i/n)%3==1 && (j/n)%3==1) // 이 조건에 해당하는 부분을 모두 차례로 제하는 방식
        printf(" ");
    else if(n/3==0) // 문제를 n==1까지 쪼갰는데도 if조건에 걸리지 않으면 별을 찍는다.
        printf("*");
    else
        recur(i,j,n/3); // n이 3이상인데 조건에 걸리지 않았다? 다시 호출
}
int main() {
    int n;
    scanf("%d", &n);
    for(int i=0;i<n;i++) {
        for(int j=0;j<n;j++)
            recur(i,j,n); // n x n개의 포인트를 모두 호출
        printf("\n"); // 줄 끝날때마다 개행
    }
}

댓글