woonadz :)

[백준/C언어] 재귀_2447번_nabi 본문

IT/백준

[백준/C언어] 재귀_2447번_nabi

C_scorch 2021. 10. 14. 23:24
반응형

문제를 이해하는데만 한 5분 넘게 걸린 것 같다.

"N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다." 이 부분을 쉽게 해석하면 3의 1승을 제외한 모든 3의 제곱수에 대해 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싸기가 성립한다.

 

위 예제를 쉽게 이해하려면 '크기 N의 패턴은 NxN 정사각형 모양이다' 를 기본으로 생각하고 조건들을 추가해야한다.

사진과 함께 설명하겠다. (예쁜 선을 그리는 능력이 딸려서...)

빨간색 : 가장 큰 정사각형 27x27 모양이다.

파란색 : 파란색 칸을 이해하는데 시간이 좀 걸렸다. 파란색 정사각형 바깥 별들이 9x9 모양일 줄 알고 세어보았지만 아니었다. 공백칸, 즉 파란색 칸이 9x9 모양이다.

노란색 : N = 27 일 때 "크기 N/3의 패턴으로 둘러싼 형태이다." 구절을 출력한 부분이 여기다. 겉에 별 모양을 세어보면 9x9 모양이다.

초록색 : N = 9 일 때 "크기 N/3의 패턴으로 둘러싼 형태이다." 구절을 출력한 부분이 여기다. 마찬가지로 겉에 별 모양을 세어보면 9x9 모양이다.

 

결론적으로 27x27 모양(빨강)의 하위 문제는 9x9, 9x9(노랑)의 하위 문제는 3x3(초록)이다.

현재 구멍들이 뚫려있는 공간을 활용해 규칙을 찾아보겠다.

(2,2) (5,2) (8,2) ... 

(2,5) (5,5) (8,5) ... 

(2,8) (5,8) (8,8) ... -> 3x3의 세줄을 보아 행,열의 경우 모두 %3 의 값이 2일 경우 *를 출력하면 안됨.

(4~6,4~6) (13~15,4~6) (22~24,4~6)

(4~6,13~15) (13~15,13~15) (22~24,13~15) -> (3x3의 경우를 제외하였을 때) 9x9의 경우를 보아 행,열 하나라도 %3 의 값이 0 또는 1일 때 *를 출력하면 안됨.

(10~18, 10~18) -> 위에 경우의 수를 모두 제외하였을 때 %3 의 값이  2일 경우 *를 출력하면 안됨.

 

가장 쉽게 해결할 수 있는 3x3 부터 코드를 짜보겠다.

#include <stdio.h>

void square(int i, int j, int N) {
    if ((i % 3 == 2) && (j % 3 == 2)) {
        printf(" ");
    }else {
        if (j == N+1) {
            printf("\n");
        }
        else {
                printf("*");
            }
    }
}
int main() {
    int N;
    scanf_s("%d", &N);
    int i, j;
    for (i = 1; i <= N; i++)
        for (j = 1; j <= N+1; j++)
                square(i, j, N);
}

 

반응형