[백준] 10994 - 별 찍기 19
1. 문제
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