반응형
https://www.acmicpc.net/problem/2447
문제
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
입력
첫째 줄에 N이 주어진다. N은 항상 3의 제곱꼴인 수이다. (3, 9, 27, ...) (N=3k, 1 ≤ k < 8)
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
처음에 예제 출력을 보자마자 프랙탈 도형이 생각났다.
처음에는 재귀적인 방법으로 결과를 바로 출력하게 만들고 싶었는데 내 머리로는 역부족이었다. 그래서 그냥 간단하게 동적할당으로 2차원 배열을 만들고 거기에 반복문으로 일일이 구멍을 뚫는(?) 방식으로 해결했다.
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
char **arr;
int a, i, j, b, x1, y1, x2, y2;
scanf("%d", &a);
arr = (char **) malloc(sizeof(char *) * a);
for (i = 0; i < a; i++)
{
arr[i] = (char *) malloc(sizeof(char) * a);
for (j = 0; j < a; j++)
{
arr[i][j] = '*';
}
}
for (b = a / 3; b != 0; b /= 3)
{
for (x1 = y1 = b; ; x1 += 3 * b)
{
if (x1 >= a)
{
x1 = b;
y1 += 3 * b;
if (y1 >= a)
{
break;
}
}
for (x2 = y2 = 0; ; x2++)
{
if (x2 >= b)
{
x2 = 0;
y2++;
if (y2 >= b)
{
break;
}
}
arr[y1 + y2][x1 + x2] = ' ';
}
}
}
for (i = 0; i < a; i++)
{
for (j = 0; j < a; j++)
{
printf("%c", arr[i][j]);
}
printf("\n");
}
for (i = 0; i < a; i++)
{
free(arr[i]);
}
free(arr);
return 0;
}
근데 자꾸 문제 분류가 재귀인데 재귀를 안 쓴다...? (그러니까 여러분들은 재귀를 멀리하고 반복을 가까이 하는 게 낫습니다) 뭔가 배열 말고 아름다운(?) 방식이 있을 거 같은데...
반응형
'프로그래밍 > C | C++' 카테고리의 다른 글
[백준] 1065번: 한수 (0) | 2019.12.15 |
---|---|
[백준] 4673번: 셀프 넘버 (0) | 2019.10.05 |
[백준] 1546번: 평균 (0) | 2019.09.29 |
[백준] 3052번: 나머지 (0) | 2019.09.14 |
[백준] 2920번: 음계 (0) | 2019.09.12 |
[C] 라그랑주 보간법을 이용한 달팽이 배열 출력 (0) | 2019.07.09 |
삼진 탐색 (Ternary search) (0) | 2019.07.06 |
다양한 피보나치 수열 알고리즘 (0) | 2019.07.04 |