1. 문제

10994번: 별 찍기 - 19



2. 개요

주어진 예시를 보고 규칙을 유추해 별을 찍는 문제.



3. 풀이 및 코드

3-1. 풀이

N = 1 일 때, 1 * 1.

N = 2 일 때, 5 * 5 + 1 * 1.

N = 3 일 때, 9 * 9 + 5 * 5 + 1 * 1.

N = 4 일 때, 13 * 13 + 9 * 9 + 5 * 5 + 1 * 1. 임을 알 수 있다.

최대 길이는 4 * N - 3 이며,

크기가 큰 순서대로 각 사각형은 (0번 부터) 번호 * 2 부터, 최대 길이 - 번호 * 2만큼의 길이를 가진다.

이를 활용해 재귀로 큰 도화지에 그림을 그려나가듯이 해결한다.

3-2. Python

import sys

N = int(sys.stdin.readline())

maxlen = 4 * N - 3
board = [[" " for i in range(maxlen)] for j in range(maxlen)]

def do(idx):
    if idx == N:
        return

    for i in range(idx * 2, maxlen - idx * 2):
        board[idx * 2][i] = '*'
        board[i][idx * 2] = '*'
        board[maxlen - idx * 2 - 1][i] = '*'
        board[i][maxlen - idx * 2 - 1] = '*'

    do(idx + 1)

do(0)

for r in board:
    print("".join(r))

3-3. C#

namespace boj_10994
{
    internal class Program
    {
        static int N;
        static int maxlen;
        static char[,] board;

        static void Main(string[] args)
        {
            StreamReader sr = new StreamReader(Console.OpenStandardInput());
            StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());

            N = int.Parse(sr.ReadLine());
            maxlen = N * 4 - 3;

            board = new char[maxlen, maxlen];

            Do(0);

            for (int i = 0; i < maxlen; i++)
            {
                for (int j = 0; j < maxlen; j++)
                {
                    if (board[i, j] == '*')
                        sw.Write(board[i, j]);

                    else
                        sw.Write(' ');
                }
                sw.WriteLine();
            }

            sw.Close();
        }

        static void Do(int idx)
        {
            if (idx == N)
                return;

            for (int i = idx * 2; i < maxlen - idx * 2; i++)
            {
                board[idx * 2, i] = '*';
                board[i, idx * 2] = '*';
                board[maxlen - idx * 2 - 1, i] = '*';
                board[i, maxlen - idx * 2 - 1] = '*';
            }

            Do(idx + 1);
        }
    }
}

Comments