쌀국수가 코딩배우며 개발일기 쓰는곳 RSS 태그 관리 글쓰기 방명록
2021-09-27 22:19:37

별찍기_기초

  j0 j1 j2 j3 j4
i0 * * * * *
i1 * * * * *
i2 * * * * *
i3 * * * * *
i4 * * * * *

 

위의 사진을 표로 나타내었다.

j는 하나의 별을 반복 출력 하기위한 내부 틀이며

ij를 몇 줄 출력할지 반복하기 위한 외부 틀이 될것이다.

 

#include <stdio.h>
int main()
{
    int i, j;

    for(i=0; i<5; i++) //외부 반복 틀 (총 5번 반복)
    {
        for(j=0;j<5;j++) //내부 반복 틀 (총 25번 반복(내부*외부))
        {
        printf("*");
        }
        printf("\n"); //내부 반복이 끝나면 한 줄 띄어쓰기
    }
    return 0;
}

별찍기_비스듬한 계단

  j0 j1 j2 j3 j4 j5
i0 * *        
i1 공백 * *      
i2 공백 공백 * *    
i3 공백 공백 공백 * *  
i4 공백 공백 공백 공백 * *

 

위의 표에서 규칙을 찾아보자.

공백 먼저 출력 후 별을 출력해야하는 규칙과,

공백은 0~4까지 순차적으로 늘어난다는 규칙을 알 수 있다.

그리고 아래 코드와같이 반복문 외부에서 변수를 출력할 일이 없을땐 반복문 초기식 안에서 변수를 선언해주어도 된다.

j, k는 i처럼 타 변수와 비교할 일이 없으므로 k를 j로 써줘도 되지만 헷갈릴까봐 변수 이름을 3개 사용했다.

 

#include <stdio.h>
int main()
{
    for(int i=0; i<5; i++) //총 5줄이 반복 출력된다.
    {
        for(int j=0; j<i; k++) //공백은 0부터 시작해서 i보다 작을때까지 반복한다. (i2(3번째 줄)면 j0,j1 2번 출력)
        {
            printf(" ");
        }
        for(int k=0; k<2; k++) //별은 k0, k1 두 번 출력을 반복한다.
        {
            printf("*");
        }
        printf("\n"); //내부 반복문들이 끝나면 한 줄 띄운다.
    }
}

별찍기_피라미드 (정방향)

  j0 j1 j2 j3 j4 j5 j6 j7 j8
i0 공백 공백 공백 공백 *        
i1 공백 공백 공백 * * *      
i2 공백 공백 * * * * *    
i3 공백 * * * * * * *  
i4 * * * * * * * * *

 

공백은 4~0순으로 감소하면 된다.

별의 규칙을 살펴보자. '1, 3, 5, 7, 9' 즉, 2씩 늘어난다.

처음엔 감을 못잡았다. '어떻게 i 값에 따라 첫줄에 1개만 쓰고 이후 2개씩 늘어나게 하지??' 하고..

i 값에 따라 늘어나야 하므로 아래와 같이 i*2+1을 해주었다.

*첫 줄은 별을 1개만 출력해야 하므로 i0일땐 0*2+1 = 1

 

#include <stdio.h>
int main()
{
    for(int i=0; i<5; i++) //외부 반복문 (5번 반복)
    {
        for(int j=0; j<5-i; j++) //공백 반복 (i0 = j<5-0 = 4번 반복)
        {
            printf(" ");
        }
        for(int k=0; k<i*2+1; k++) //별 반복 (i0 = k<0*2+1 = 0번 반복)
        {
            printf("*");
        }
        printf("\n"); //내부 반복이 끝나면 한 줄 띄어쓰기
    }
}

별찍기_피라미드 (역방향)

  j0 j1 j2 j3 j4 j5 j6 j7 j8
i0 * * * * * * * * *
i1 공백 * * * * * * *  
i2 공백 공백 * * * * *    
i3 공백 공백 공백 * * *      
i4 공백 공백 공백 공백 *        

 

정방향도 했는데 역방향은 쉽지 않을까? 했지만 내 머리로는 쉽지 않았다.

공백은 i 값과 동일하게 늘어나면 된다지만 별은..

별의 왼쪽이 n개가 없어지면 오른쪽도 n개가 없어진다. 또한 i의 값과 왼쪽, 오른쪽의 별이 사라지는 수는 동일하다.

별의 최대 출력수는 9개다. 고로 9개에서 i*2를 빼주면 된다.

 

#include <stdio.h>
int main()
{
    for(int i=0; i<5; i++) //외부 반복문
    {
        for(int j=0; j<i; j++) //공백 반복 (i2 = j<2 = j0,j1 = 2번 반복)
        {
            printf(" ");
        }
        for(int k=0; k<9-i*2; k++) //별 반복 (i2 = k<9-2*2 = k<5 = k0,k1,k2,k3,k4 = 5번 반복)
        {
            printf("*");
        }
        printf("\n"); //내부 반복이 끝나면 한 줄 띄어쓰기
    }
}