본문 바로가기
Development/Baekjoon

[C#] 2444번: 별 찍기 - 7

by Mobics 2025. 8. 18.

목차


    백준 단계별로 풀어보기

    25.08.18

    6단계: 심화 1


    2444번: 별 찍기 - 7

    문제 링크 : https://www.acmicpc.net/problem/2444

     

    문제를 풀기 위해 필요한 것

    - 별이 찍히는 패턴 분석

    : 주어지는 입력값을 'N'이라고 하자.

    1. 전체 행의 개수는 (N * 2 - 1)개이다.
    2. 첫 행에서 공백의 개수는 (N - 1)개이며, 다음 행으로 내려갈수록 개수가 1개씩 줄어들다가 (N + 1)번째 행부터 다시 1개씩 늘어난다.
    3. 첫 행에서 별의 개수는 1개이며, 다음 행으로 내려갈수록 개수가 2개씩 늘어나다가 (N + 1)번째 행부터 다시 2개씩 줄어든다.

     

    - 이를 구현하기 위한 생각

    • 전체 행의 개수만큼 반복해야하는데, 첫 시작을 1부터 시작하도록 --> for (int i = 1; i < count * 2; i++)
    • N번째 행을 기준으로 대칭을 이룬다. --> 조건문으로 (i <= N)과 (i > N)을 나눠서 생각
    • 첫 행에서 공백의 개수가 (N - 1)개이고 행을 내려갈수록 공백이 한 개씩 줄어드는 것은 (N - i)로 표현 가능하다. 그리고 반대로 N번째 행 이후로 공백이 한 개씩 늘어나는 것은 (i - N)으로 표현 가능하다.
    • 별의 개수는 첫 행에 하나, 그 뒤로 2개씩 늘어난다. --> (i * 2 - 1)
    • 별의 개수는 N번째 행 이후로 2개씩 줄어든다.
      • 이 부분이 가장 어려웠는데, 아래쪽 삼각형에서 행 번호 i를 그대로 쓰면 별 개수가 커지기 때문에 전체 높이 (N * 2)에서 i를 빼서 역방향 줄 번호를 얻는다. --> (N * 2 - i)
      • 위쪽 삼각형에서 했듯이 홀수 개수를 만들기 위해 (* 2 - 1)을 붙여준다. --> (N * 2 - i) * 2 - 1

    역방향 줄 번호에 대한 보충

     

    정답 코드

    using System.Text;
    
    class Backjoon
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();
            int count = int.Parse(Console.ReadLine());
    
            for (int i = 1; i < count * 2; i++)
            {
                if (i <= count)
                {
                    for (int j = 0; j < count - i; j++)
                    {
                        sb.Append(" ");
                    }
                }
                else
                {
                    for (int j = 0; j < i - count; j++)
                    {
                        sb.Append(" ");
                    }
                }
    
                if (i <= count)
                {
                    for (int j = 0; j < i * 2 - 1; j++)
                    {
                        sb.Append("*");
                    }
                }
                else
                {
                    for (int j = 0; j < (count * 2 - i) * 2 - 1; j++)
                    {
                        sb.Append("*");
                    }
                }
                sb.AppendLine();
            }
            Console.Write(sb.ToString());
        }
    }