백준 2447번 : 별 찍기 -10 [C#]

2026. 2. 24. 18:46CS/알고리즘

1. 재귀인 것 같은데 어떤 단위로 나눌까

> N =3 일 때 9칸 중 정가운데 한 칸만 비었음 > 이 형태가 반복되니까 항상 9개로 나눠서 각 영역마다 다시 재귀를 돌려야겠다.

 

2. 재귀로 쪼갠다음 작은 단위에서 별을 어떻게 저장할까

> 바로 출력? 안된다. 재귀로 점을 찍는 실행 순서를 생각해봐야겠다.

> 문자열은 한 줄씩 출력하니까 문자열 배열에 각 라인마다 들어갈 점을 추가해야겠다.

> 재귀 단계에서 점을 찍을 때 나중에 출력할 문자열에 더하는 방식으로 점을 쌓아가야겠다.

> 재귀를 돌 때 현재 몇 번째줄에 있는지 위치 좌표를 알아야겠다. x는 점을 추가할 때 고려하지 않으니까 재귀의 인자로 y값을 추가한다.

 

3. 여러줄을 출력하는데 StringBuilder를 쓰는게 나을까 Console.Write가 나을까

> 결과적으로 3의 8제곱이면 6000라인 언저리로 출력횟수는 생각보다 적었고, StringBuilder는 메모리를 많이 먹어서 효율이 별로였다.

위: stringbuilder / 아래: console.write

 

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