촉촉한초코칩

[백준] 2444(별 찍기 - 7) c언어 본문

Algorithm

[백준] 2444(별 찍기 - 7) c언어

햄친구베이컨 2023. 6. 25. 23:13

문제

예제를 보고 규칙을 유추한 뒤에 별을 찍어 보세요.

입력

첫째 줄에 N(1 ≤ N ≤ 100)이 주어진다.

출력

첫째 줄부터 2×N-1번째 줄까지 차례대로 별을 출력한다.

 


 

  1. 2*N-1 변수를 따로 저장한다. 
  2. 처음에 출력되야할 별 개수 1개를 star에 저장하고, 공백개수인 n-1을 index에 저장한다. 
  3. 먼저 5번째 줄까지는 별이 증가하는 구간이므로 i를 n까지 반복하고 
    공백 개수만큼 for문 돌려서 공백을 출력한다. 
    star 개수만큼 for문을 돌려서 *을 출력한다. 
  4. 만약 i가 n과 같다면 for문을 빠져나오고, 아니라면 star은 2씩 증가, index는 1 감소시킨다. 
  5. 감소하는 구간에는 먼저 index 1 증가, star 2 감소시키고 1까지 줄어드는 for문을 만든다. 
    마찬가지로 공백 개수, star 개수만큼 for문을 돌리고 출력한다. 
  6. 반대로 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 이런 에러가 떠서 위에 다시 정의해주었다. 

메인함수 뒤에 썼을 때만 정의해주어야 하는 줄 알았는데 서브함수는 다 정의해야 하는 것 같다. 

 

코드가 매우 복잡한데... 언젠가 다시 간결하게 수정할 수 있기를....★