백준 2448번
문제
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
입력
첫째 줄에 N이 주어진다. N은 항상 \(3\times2^{k}\) 수이다. (3, 6, 12, 24, 48, …) (0 ≤ k ≤ 10, k는 정수)
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제 입력
24
예제 출력
* * * ***** * * * * * * ***** ***** * * * * * * ***** ***** * * * * * * * * * * * * ***** ***** ***** ***** * * * * * * ***** ***** * * * * * * * * * * * * ***** ***** ***** ***** * * * * * * * * * * * * ***** ***** ***** ***** * * * * * * * * * * * * * * * * * * * * * * * * ***** ***** ***** ***** ***** ***** ***** *****
코딩을 배우는 이유는 사실 콘솔창에 별을 멋지게 찍기 위해서가 아닐까?…
접근 과정
- 3줄짜리 작은 삼각형 모양을 잘 구성하여 높이가 N인 삼각형 모양을 만든다. 크기가 N인 삼각형은 크기가 (N - 1)인 삼각형 3개로 구성되어 있다. 여기서 재귀호출을 통해 구현하면 참으로 편하겠다 싶은 생각이 들었다.
- makeTriangleTower()는 높이가 N인 삼각형을 지정된 위치에 만드는 함수로 N-1 짜리 삼각형을 3개 만들도록 재귀호출을 수행한다. 각 삼각형이 위치해야할 적당한 좌표를 계산해준다면 완료. 호출시 쨔잔 하고 버퍼에 출력할 결과를 저장해준다.
- 동적메모리를 사용하지 않고 정적메모리를 사용해 구현해도 문제는 없다. 딱 맞는 버퍼 크기를 만들어야겠다 생각하다보니 이렇게 구현되었다 -_-;
소스 코드
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int N;
char triangle[3][5] = {
" * ",
" * * ",
"*****"
};
char** buffer;
void makeTriangleTower(int size, int offsetX, int offsetY) {
if (size == 3) {
for (int i = 0; i < 3; ++i) {
memcpy(buffer[offsetY + i] + offsetX, triangle[i], 5);
}
return;
}
int nextSize = size / 2;
int nextWidth = nextSize * 2 - 1;
makeTriangleTower(nextSize, offsetX + (nextWidth / 2) + 1, offsetY);
makeTriangleTower(nextSize, offsetX, offsetY + nextSize);
makeTriangleTower(nextSize, offsetX + nextWidth + 1, offsetY + nextSize);
}
int main(void) {
scanf("%d", &N);
int width = N * 2 - 1; // (N / 3 * 6 - 1)
buffer = malloc(sizeof(char*) * N);
for (int i = 0; i < N; ++i) {
buffer[i] = malloc(sizeof(char) * (width + 1));
memset(buffer[i], ' ', sizeof(char) * (width + 1));
buffer[i][width] = '\0';
}
makeTriangleTower(N, 0, 0);
for (int i = 0; i < N; ++i) {
puts(buffer[i]);
free(buffer[i]);
}
free(buffer);
return 0;
}