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;

}


+ Recent posts