N Log

별 찍기 눕힌 모래시계

문제

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

해답

눕힌 모래시계는 중심 (4, 4)을 기준으로 좌우 대칭이다.

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

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

#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 depth = middle_index - distance;

        int left_star_count = depth + 1;
        int middle_space_count = 2 * distance - 1;
        int right_star_count = left_star_count;

        if (distance == 0)
        {
            left_star_count = size;
            middle_space_count = 0;
            right_star_count = 0;
        }

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

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

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

        printf("\n");
    }
}

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

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

왼쪽 별 개수는 1, 2, 3, 4, 5, 4, 3, 2, 1 순서로 변한다.
depth 값은 0, 1, 2, 3, 4, 3, 2, 1, 0 순서로 변한다.
depth + 1로 왼쪽 별 개수를 구할 수 있다.

가운데 행을 제외하고 공백 수의 변화를 보자.
가운데 행에서 멀어질 때마다 1, 3, 5, 7처럼 2개씩 늘어난다.
1, 2, 3, 4로 변하는 distance를 이용하면 2 * distance - 1로 공백 수를 구할 수 있다.
다만 가운데 행은 공백이 없으므로 if (distance == 0) 조건 검사를 해서 따로 처리한다.

각 칸마다 조건 판단해 출력

#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 row_distance = abs(row - middle_index);

        for (int col = 0; col < size; col++)
        {
            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)로부터의 열 거리가 행 거리 이상인 칸에 별을 찍는다.

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

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