N Log

별 찍기 모래시계

문제

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

해답

모래시계는 가운데 행인 4행을 기준으로 위아래 대칭이다.

  • 0행: 공백 0개, 별 9개
  • 1행: 공백 1개, 별 7개
  • 2행: 공백 2개, 별 5개
  • 3행: 공백 3개, 별 3개
  • 4행: 공백 4개, 별 1개
  • 5행: 공백 3개, 별 3개
  • 6행: 공백 2개, 별 5개
  • 7행: 공백 1개, 별 7개
  • 8행: 공백 0개, 별 9개

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

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const int size = 9;
    const int middle_index = size / 2;

    for (int row = 0; row < size; row++)
    {
        int distance = abs(row - middle_index);

        int space_count = middle_index - distance;
        int star_count = 2 * distance + 1;

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

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

        printf("\n");
    }
}

변수 middle_index는 가운데 행 번호인 4를 저장한다.
변수 distance는 현재 행이 가운데 행에서 얼마나 떨어져 있는지를 나타낸다.

현재 0행이라면, distance는 4이다.
현재 1행이라면, distance는 3이다.

별 개수는 9, 7, 5, 3, 1, 3, 5, 7, 9 순서로 변한다.
distance 값은 4, 3, 2, 1, 0, 1, 2, 3, 4 순서로 변한다.
2 * distance + 1로 별 개수를 구할 수 있다.

공백 수의 변화를 보자.
가운데 행에서 1만큼 멀어지면 공백 수가 1만큼 감소한다.
가운데 행의 공백 수는 middle_index와 같다.
그래서 middle_index - distance로 공백 수를 구할 수 있다.

각 칸마다 조건 판단해 출력

#include <stdio.h>
#include <stdlib.h>

int main()
{
    const int size = 9;
    const int middle_index = size / 2;

    for (int row = 0; row < size; row++)
    {
        for (int col = 0; col < size; col++)
        {
            int row_distance = abs(row - middle_index);
            int col_distance = abs(col - middle_index);

            if (col_distance <= row_distance)
            {
                printf("*");
            }
            else
            {
                printf(" ");
            }
        }
        printf("\n");
    }
}

이 방식은 행마다 공백과 별의 개수를 계산하지 않고, 9 x 9 = 81칸을 모두 검사한다.

모래시계 그림에서 각 칸을 (row, col) 좌표로 보면, 별이 찍히는 칸에는 다음 규칙이 있다.
중심 (4, 4)로부터의 열 거리가 행 거리 이하인 칸에 별을 찍는다.

(1, 1)은 중심 (4, 4)로부터 행 거리 3, 열 거리 3만큼 떨어져 있다.
열 거리가 행 거리 이하이므로 별을 출력한다.

(1, 0)은 중심 (4, 4)로부터 행 거리 3, 열 거리 4만큼 떨어져 있다.
열 거리가 행 거리를 초과하므로 공백을 출력한다.