13015 별 찍기 - 23
https://www.acmicpc.net/problem/13015
이 문제는 상당히 골때리는 문제였다.
다들 잘 알고있는 별 찍기 문제이다.
다만 패턴이 조금....
우선 나는 점화식이라던가 일종의 패턴을 찾아보기 위해 2부터 5까지의 모양을 직접 그려서 공백과 별 개수를 확인해보았다.
2 |
3 |
4 |
** ** *** ** ** |
*** *** * * * * *** *** |
**** **** * * * * * * * * * * * * * * * * * * * **** **** |
5 |
***** ***** * * * * * * * * * * * * * * * * * * * * * * * * * * * ***** ***** |
이야 다 적고 보니 정말 굉장한 패턴이다.
처음에는 보고 그냥 아무생각도 안들었는데 정리를 해보고보니 규칙을 적당히 찾을 수 있었다.
오른쪽 공백은 생각하지 않아도 되니 왼쪽 공백과 위 아래의 공백을 생각해야했다.
그렇게 생각하고 모양을 잘 보니
공백을 *이라 생각하고 보면 단순한 별 찍기 모양에 불과했다.
***** *
*** ***
* *****
위 아래 모양은 단순하게 7 5 3 1 이나 1 3 5 7 과 같이 홀수증가이었다.
*
**
***
**
*
왼쪽 모양은 단순하게 삼각형이였다.
그리고 중간에 실제 별들을 찍을 때 공백의 공간은 5 -> * *이므로, * -> 2, ' ' -> 5-2이다.
따라서 별 찍는 방식은 맨 위와 맨 아래를 제외하고 n-2만큼 공백을 찍게된다.
그렇게 생각한 규칙으로 만들어진 코드가 바로 이것이다.
부분부분 더럽게 짠 부분이 있기는 하지만 일단 풀리긴 했다. 나중에 생각나면 좀더 최적한 코드로 재업해야겠다.
#include <stdio.h>
int main()
{
int i,j,k,n,udspace;
scanf("%d", &n);
udspace=(2*(n-1))-1;
for(i=0; i<n; i++) printf("*");
for(i=0; i<udspace; i++) printf(" ");
for(i=0; i<n; i++) printf("*");
udspace-=2;
printf("\n");
for(i=0; i<n-1; i++) {
for(j=0; j<=i; j++) printf(" ");
printf("*");
for(k=0; k<n-2; k++) printf(" ");
printf("*");
for(k=0; k<udspace; k++) printf(" ");
udspace-=2;
if(i!=n-2)printf("*");
for(k=0; k<n-2; k++) printf(" ");
printf("*\n");
}
udspace=1;
for(i=n-2; i>0; i--) {
for(j=i; j>0; j--) printf(" ");
printf("*");
for(k=n-2; k>0; k--) printf(" ");
printf("*");
for(k=udspace; k>0; k--) printf(" ");
udspace+=2;
printf("*");
for(k=n-2; k>0; k--) printf(" ");
printf("*\n");
}
for(i=0; i<n; i++) printf("*");
for(i=0; i<udspace; i++) printf(" ");
for(i=0; i<n; i++) printf("*");
return 0;
}
'C, C++ > 백준' 카테고리의 다른 글
5904번 Moo 게임 문제를 풀어보았다. (1) | 2019.04.01 |
---|---|
1145번 적어도 대부분의 배수 문제를 풀어보았다. (2) | 2019.03.25 |
10952번 A + B - 5 문제를 풀어보았다. (0) | 2019.03.25 |
10950번 A + B - 3 문제를 풀어보았다. (0) | 2019.03.25 |
1003번 피보나치 함수 문제를 풀어보고있다.(1) (0) | 2019.03.23 |