2447. 별 찍기 - 10 (누르면 해당 문제로 이동)
재귀적인 패턴을 재귀함수로 찍는 문제 1
제약사항)
시간 : 1 초
메모리 : 256 MB
문제)
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
입력)
첫째 줄에 N이 주어진다. N은 항상 3의 제곱꼴인 수이다. (3, 9, 27, ... ) (N=3^k, 1<=k<8)
출력)
첫째 줄부터 N번째 줄까지 별을 출력한다.
입출력 예제
입력 | 출력 |
27 |
풀이 순서)
각 입력에 따른 규칙을 찾아야 하는 문제입니다.
규칙은 아래 그림과 같습니다.
빨간 테투리마다 N=1, N=3, N=9, N=27 일때 결과입니다. (초록색으로 *을 표현했습니다.)
규칙은 알았지만, 코드로 구현하기가 꽤나 까다로운 문제였다.
구글링을 통해 많은 블로그에서 풀이법과 코드를 보고 어떻게 구현되는지 이해할 수 있었습니다.
하지만, 혼자서 쉽게 생각하기 힘든 방법이었고, 공부할 겸 나름대로 스스로 해결해보기로 했습니다.
제가 구현한 코드의 규칙은 다음과 같습니다.
1. N을 입력받고, 나는 크기가 3일때 부터 빈칸이여야 하는 가운데를 지워나가기로 했습니다.
N=9일 때에는 가운데 부분만 모두 지우고, 나머지 부분은 크기가 3인 블록의 값을 대입하도록 했습니다.
아래 그림의 순서와 같이 동작하도록 코드를 구현했습니다.
효율성 등 여러 방면에서 보았을 때 타 블로그에 있는 다른 코드들이 훨씬 더 효율적일 것이라고 생각합니다.
스스로의 공부를 위해 작성한 코드이므로, 타 블로그를 참고하시면 더 짧고 쉬운 코드들을 많이 보실 수 있을 겁니다.:)
소스코드 및 결과 (C)
#include <stdio.h>
#define size 3000
char flags[size][size] = { NULL };
int star(int num, int n_num) {
if (n_num == num*3)
return 0;
else {
if (n_num==3) {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
if (i % 3 == 1 && j % 3 == 1)
flags[i][j] = ' ';
else
continue;
}
}
}
else {
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
if (n_num / 3 <= i && i < 2 * n_num / 3 && n_num / 3 <= j && j < 2 * n_num / 3)
flags[i][j] = ' ';
else
flags[i][j] = flags[i % n_num][j % n_num];
}
}
}
star(num, n_num * 3);
}
}
int main() {
int N;
scanf("%d", &N);
for (int i = 0; i < N; i++)
for (int j = 0; j < N; j++)
flags[i][j] = '*';
star(N, 3);
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
printf("%c", flags[i][j]);
}
printf("\n");
}
return 0;
}
메모리 : 9900 KB
시간 : 268 ms
코드길이 : 895 B
'[C언어] 백준온라인 > * 재귀' 카테고리의 다른 글
[C 언어] 백준 11729. 하노이 탑 이동 순서 (0) | 2020.01.15 |
---|---|
[C 언어] 백준 10870. 피보나치 수 5 (0) | 2020.01.15 |
[C 언어] 백준 10872. 팩토리얼 (0) | 2020.01.15 |