백준 2447번 : 별 찍기 -10 [C#]
2026. 2. 24. 18:46ㆍCS/알고리즘
1. 재귀인 것 같은데 어떤 단위로 나눌까
> N =3 일 때 9칸 중 정가운데 한 칸만 비었음 > 이 형태가 반복되니까 항상 9개로 나눠서 각 영역마다 다시 재귀를 돌려야겠다.
2. 재귀로 쪼갠다음 작은 단위에서 별을 어떻게 저장할까
> 바로 출력? 안된다. 재귀로 점을 찍는 실행 순서를 생각해봐야겠다.
> 문자열은 한 줄씩 출력하니까 문자열 배열에 각 라인마다 들어갈 점을 추가해야겠다.
> 재귀 단계에서 점을 찍을 때 나중에 출력할 문자열에 더하는 방식으로 점을 쌓아가야겠다.
> 재귀를 돌 때 현재 몇 번째줄에 있는지 위치 좌표를 알아야겠다. x는 점을 추가할 때 고려하지 않으니까 재귀의 인자로 y값을 추가한다.
3. 여러줄을 출력하는데 StringBuilder를 쓰는게 나을까 Console.Write가 나을까
> 결과적으로 3의 8제곱이면 6000라인 언저리로 출력횟수는 생각보다 적었고, StringBuilder는 메모리를 많이 먹어서 효율이 별로였다.

using System;
using System.Runtime.InteropServices;
using System.Text;
class Program
{
public static string[] starLines;
public static void star(int n, int y)
{
if (n > 1)
{
star(n/3, y); // 1
star(n/3, y); // 2
star(n/3, y); // 3
star(n/3, y + n/3); // 4
empty(n/3, y + n/3); // 5
star(n/3, y + n/3); // 6
star(n/3, y + n/3 *2); // 7
star(n/3, y + n/3 *2); // 8
star(n/3, y + n/3 *2); // 9
}
else
{
starLines[y] += "*";
}
}
public static void empty(int n, int y)
{
if (n > 1)
{
empty(n/3, y); // 1
empty(n/3, y); // 2
empty(n/3, y); // 3
empty(n/3, y + n/3); // 4
empty(n/3, y + n/3); // 5
empty(n/3, y + n/3); // 6
empty(n/3, y + n/3 *2); // 7
empty(n/3, y + n/3 *2); // 8
empty(n/3, y + n/3 *2); // 9
}
else
{
starLines[y] += " ";
}
}
static void Main()
{
int N = int.Parse(Console.ReadLine());
starLines = new string[N+1];
star(N,0);
StringBuilder sb = new StringBuilder();
for(int i=0; i<=N; i++)
{
sb.AppendLine(starLines[i]);
}
Console.Write(sb.ToString());
}
}'CS > 알고리즘' 카테고리의 다른 글
| 백준 2580번 : 스도쿠 [C#] (0) | 2026.02.26 |
|---|---|
| 백준 9663번 : N-Queen [C#] (0) | 2026.02.26 |
| [C#] Baekjoon용 C# 문법 (0) | 2026.02.11 |
| [C++] 코딩 테스트 대비용 C++ 문법 정리 (0) | 2025.01.15 |
| 백준 9251번 : LCS[java] (0) | 2023.02.22 |