| 문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
| 입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
| 출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
| 예제 입력 1
27
| 예제 출력 1
| 문제의 키 포인트
1. 해당 문제에서 중요한건 별 패턴을 어떻게 찍는지이다.
> 첫째 줄에서는 N을 입력 받고, (N/3)x(N/3)의 정사격형을 크기 N/3의 패턴으로 둘러싼 형태이다. (단, 여기서 N이 3보다 커야한다.)
2. 공백이 들어가는 위치
> 별을 줄을 나누지 않고 1열로 보았을 때, 공백이 들어가는 시점은 5번째, 배열에서는 즉 4번째를 가리킨다.
> 이는 가로와 세로 열의 위치를 나누었을 때, 각각 나머지가 1인 경우에 해당한다.
**** ****
> 예제 값을 분석해보면, 아래와 같다.
| 해결방안(Solution)
1. 조건 1과 조건 2에 따라 함수를 작성해주고, 이를 재귀함수로 작동시킨다.
(조건 1): 공백이 들어가는 위치
> 행과 열을 각각 3으로 나누었을 때 나머지가 1인 경우
(조건 2): 별이 들어가는 위치
> (조건 1)을 만족하지 않고, N을 3으로 나누었을 때 몫을 가지는 경우
| 소스코드(SourceCode)
// BOJ_2447_Star_recursive, 별 찍기 - 10
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
void StarRecursive(int i, int j, int N);
int main(void)
{
int N, i, j;
scanf("%d", &N);
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
StarRecursive(i, j, N);
}
printf("\n");
}
return 0;
}
void StarRecursive(int i, int j, int N)
{
if ((i / N) % 3 == 1 && (j / N) % 3 == 1)
{
printf(" ");
}
else
{
if (N / 3 == 0)
{
printf("*");
}
else
{
StarRecursive(i, j, N / 3);
}
}
}
| 문제출처
https://daily-life-in-20s.tistory.com/132
'코딩 | 알고리즘 & 문제풀이 > 백준_Backjoon' 카테고리의 다른 글
[C언어] Backjoon_Code 2798, 블랙잭 (0) | 2021.08.07 |
---|---|
[C언어] Backjoon_Code 11729, 하노이 탑 이동 순서 (0) | 2021.08.06 |
[C언어] Backjoon_Code 10870, 피보나치 수 (0) | 2021.08.04 |
[C언어] Backjoon_Code 10872, 팩토리얼 (0) | 2021.08.03 |
[C언어] Backjoon_Code 1002, 터렛 (0) | 2021.08.02 |