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 = row;
        int star_count = height - row;

        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");
    }
}

앞의 별 찍기 역피라미드 문제는 별이 빈틈없이 붙어 있고, 별 개수가 9, 7, 5, 3, 1처럼 홀수로 줄어드는 형태였다.
이번 공백 역피라미드는 별 개수가 행마다 1개씩 감소하고, 별과 별 사이에 공백이 들어간다.

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

앞 공백 수는 0부터 시작해서 행이 1씩 증가할 때마다 1씩 증가한다.
따라서 현재 행 번호인 row로 앞 공백 수를 구할 수 있다.

각 행마다 필요한 별의 수는 height에서 행 번호만큼 줄어든다.
따라서 height - row로 별의 수를 구할 수 있다.

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