[백준 문제 풀이] 2447번 별 찍기 - 10

Junu Kim·2026년 1월 19일
post-thumbnail

[2447] 별 찍기 - 10

난이도: ★★★☆☆ • solved on: 2026-01-19


문제 요약

  • 문제 유형: 재귀, 분할 정복
  • 요구사항: 크기 N의 정사각형에 대해 중앙이 비어 있는 별 패턴을 재귀적으로 출력해야 한다.

사용 개념

  1. 자료구조

    • List<String> : 각 줄을 문자열 단위로 관리
  2. 알고리즘/기법

    • 재귀 (Recursion)
    • 분할 정복 (Divide and Conquer)
  3. 핵심 키워드

    • 패턴 생성 (pattern generation)
    • 재귀적 구조 (recursive structure)

풀이 아이디어

  1. 문제 분해
  • N이 1일 때는 "*" 하나로 종료되는 기저 조건을 둔다.

  • N이 1보다 클 경우, 크기 n/3의 별 패턴을 먼저 만든다.

  • 만들어진 작은 패턴을 이용해

    • 위: ***
    • 중간: * *
    • 아래: ***
      형태로 결합한다.
  1. 핵심 로직 흐름

    getStars(n):
        if n == 1:
            return ["*"]
    
        small = getStars(n / 3)
    
        for s in small:
            add s + s + s
    
        for s in small:
            add s + blank + s
    
        for s in small:
            add s + s + s
  2. 예외 처리

    • n == 1 인 경우 바로 리스트를 반환하여 재귀를 종료한다.

코드

import java.util.*;
import java.lang.*;
import java.io.*;

class Main {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();
        List<String> result = getStars(n);
        StringBuilder sb = new StringBuilder();
        for(String s : result) {
            sb.append(s).append("\n");
        }
        System.out.println(sb);
    }
    
    public static List<String> getStars(int n) {

        List<String> result = new ArrayList<>();

        if(n == 1) {
            result.add("*");
            return result;
        }

        List<String> smallStars = getStars(n / 3);
        for(String s : smallStars) {
            result.add(s + s + s);
        }

        String blank = "";
        for(int i = 0; i < n / 3; i++){
            blank += " ";
        }

        for(String s : smallStars) {
            result.add(s + blank + s);
        }

        for(String s : smallStars) {
            result.add(s + s + s);
        }
        return result;
    }
}

시간·공간 복잡도

  • 시간 복잡도: O(N²)

    • 최종적으로 N×N 크기의 별 패턴을 생성해야 하므로 출력량 자체가 O(N²)이다.
  • 공간 복잡도: O(N²)

    • 모든 줄을 문자열로 저장하는 리스트 때문이며, 재귀 호출 스택은 O(log₃N) 수준이다.

어려웠던 점

  • 처음에 접근 자체가 되지 않았다.
  • 재귀를 쓰는 것은 알겠지만, 반환 타입을 String, List<String>, String[][] 중에서 무엇으로 할지 결정하지 못해 설계 단계에서 막혔다.
  • 결국 재귀 함수의 역할을 n 크기의 패턴 전체를 반환한다로 명확히 정의하면서 해결할 수 있었다. (int로 받고 List<String>으로 리턴하기)

배운 점 및 팁

  • 재귀 문제에서는 함수의 역할을 한 문장으로 정의하는 것이 매우 중요하다.

    • 재귀 함수는 유닛 단위로 반복하는 것이기 때문

    • 예: getStars(n)n 크기의 별 패턴을 문자열 리스트로 반환한다

  • 출력 형태가 줄 단위로 고정되어 있다면 List<String>이 매우 자연스럽다.

  • 중앙을 비우는 문제는 대부분 3등분 구조를 가지므로, 먼저 작은 패턴을 만든 뒤 조합하는 방식이 핵심이다.


참고 및 링크


추가 연습 문제

profile
생각이 현실이 될 수 있도록 노력하는 중입니다.

0개의 댓글