촉촉한초코칩
[백준] 2444(별 찍기 - 7) c언어 본문
문제
예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.
입력
첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.
출력
첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.
- 2*N-1 변수를 따로 저장한다.
- 처음에 출력되야할 별 개수 1개를 star에 저장하고, 공백개수인 n-1을 index에 저장한다.
- 먼저 5번째 줄까지는 별이 증가하는 구간이므로 i를 n까지 반복하고
공백 개수만큼 for문 돌려서 공백을 출력한다.
star 개수만큼 for문을 돌려서 *을 출력한다. - 만약 i가 n과 같다면 for문을 빠져나오고, 아니라면 star은 2씩 증가, index는 1 감소시킨다.
- 감소하는 구간에는 먼저 index 1 증가, star 2 감소시키고 1까지 줄어드는 for문을 만든다.
마찬가지로 공백 개수, star 개수만큼 for문을 돌리고 출력한다. - 반대로 star은 2씩 감소, index는 1씩 증가시킨다. .
우선 주어진 길이가 있을 때 공백과 출력해야 할 문자를 나누는 데에서 막혔다.
https://www.dotnetkorea.com/docs/c-language/challenge/c-text-center/
여기 블로그를 참고해서 총 길이와 i를 빼고 2를 나누는 걸로 구했었는데, 2로 나누다 보니 다음 줄에도 똑같은 몫이 나오는 경우가 있어서 증가/감소가 제대로 되지 않았다.
결국 star와 index 하나하나 감소/증가하는 식을 사용했다.
뭔가 더 간단한 방법이 있을 것 같기도 한데... 잘 모르겠다
처음에는 main함수에서 다 썼다가 star와 index는 감소하는 구간에서 다시 초기화해야 돼서 함수를 따로 써줬다.
#include <stdio.h>
int star2(int, int, int);
int star1(int n, int index, int star) {
for(int i=1; i<=n; i++) {
//int index = (tmp - i) / 2;
for(int x=0; x<index; x++)
printf(" ");
for(int y=0; y<star; y++)
printf("*");
if(i == n)
break;
star+=2;
index-=1;
printf("\n");
}
printf("\n");
star2(n, index, star);
return 0;
}
int star2(int n, int index, int star) {
index+=1;
star-=2;
for(int i=n; i>1; i--) {
for(int x=0; x<index; x++)
printf(" ");
for(int y=0; y<star; y++)
printf("*");
star-=2;
index+=1;
printf("\n");
}
return 0;
}
int main(void) {
int n;
scanf("%d", &n);
int tmp = 2 * n - 1;
int star = 1;
int index = n - 1;
star1(n, index, star);
}
* 함수 두개를 썼는데 두번째 함수를 쓸 때 implicit declaration of function 이런 에러가 떠서 위에 다시 정의해주었다.
메인함수 뒤에 썼을 때만 정의해주어야 하는 줄 알았는데 서브함수는 다 정의해야 하는 것 같다.
코드가 매우 복잡한데... 언젠가 다시 간결하게 수정할 수 있기를....★
'Algorithm' 카테고리의 다른 글
[백준] 11653(소인수분해) c언어 (0) | 2023.07.09 |
---|---|
[백준] 10988(팰린드롬인지 확인하기) c언어 (0) | 2023.07.09 |
[미해결][백준] 25192(인사성 밝은 곰곰이) c언어 (0) | 2023.06.16 |
[백준] 10811(바구니 뒤집기) c언어 (0) | 2023.06.11 |
11. 해시 (0) | 2023.06.08 |