N Log

별 찍기 공백 피라미드

문제

테두리의 행과 열 번호는 출력하지 않아도 된다.

   0 1 2 3 4 5 6 7 8
0          *
1        *   *
2      *   *   *
3    *   *   *   *
4  *   *   *   *   *

해답

공백과 별 개수를 계산해서 출력

#include <stdio.h>

int main(void)
{
    const int height = 5;

    for (int row = 0; row < height; row++)
    {
        int space_count = height - 1 - row;
        int star_count = row + 1;

        for (int col = 0; col < space_count; col++)
        {
            printf(" ");
        }

        for (int col = 0; col < star_count; col++)
        {
            printf("*");

            if (col < star_count - 1)
            {
                printf(" ");
            }
        }

        printf("\n");
    }
}

앞의 피라미드 문제는 별 개수가 1, 3, 5, 7, 9처럼 홀수로 증가했다.
이번 공백 피라미드는 별 개수가 행마다 1개씩 증가하고, 별과 별 사이에 공백이 들어간다.

  • 0행: 앞 공백 4개, 별 1개, 별 사이 공백 0개
  • 1행: 앞 공백 3개, 별 2개, 별 사이 공백 1개
  • 2행: 앞 공백 2개, 별 3개, 별 사이 공백 2개
  • 3행: 앞 공백 1개, 별 4개, 별 사이 공백 3개
  • 4행: 앞 공백 0개, 별 5개, 별 사이 공백 4개

앞 공백 수는 height - 1부터 시작해서 행이 1씩 증가할 때마다 1씩 감소한다.
따라서 height - 1 - row로 앞 공백 수를 구할 수 있다.

각 행마다 필요한 별의 수는 행 번호보다 1개 많다.
따라서 row + 1로 별의 수를 구할 수 있다.

별과 별 사이의 공백은 printf("* ")처럼 별과 공백을 한 번에 출력할 수도 있지만,
이 방식은 마지막 별 뒤에도 공백이 하나 더 붙는다.
따라서 정확한 출력을 위해 마지막 별이 아닐 때만 공백을 출력한다.