• Home
  • About
    • Eyedicamp 개발 이야기 photo

      Eyedicamp 개발 이야기

      Big Data, Machine Learning, AI 등의 다양한 이야기를 하는 곳.

    • Learn More
    • Email
    • Instagram
    • Github
  • Posts
    • All Posts
    • All Tags
  • Projects

[BOJ 2444] 별 찍기 - 7

05 Feb 2026

Reading time ~3 minutes

문제 요약

입력으로 N이 주어질 때, 총 2*N-1줄에 걸쳐 마름모 형태로 별을 출력한다.

  • 위쪽: 공백은 줄마다 1개씩 줄고, 별은 2개씩 늘어남
  • 아래쪽: 공백은 줄마다 1개씩 늘고, 별은 2개씩 줄어듦

내가 처음 작성한 코드

n = int(input())
total_length = 2 * n - 1

for i in range(n):
    stars = 2 * i + 1
    blanks = (total_length - stars) // 2
    print(" " * blanks, end='')
    print("*" * stars)

for j in range(n - 1):
    stars = (2 * n - 1) - (2 * (j + 1))
    blanks = (total_length - stars) // 2
    print(" " * blanks, end='')
    print("*" * stars, end='')

    if j != n - 2:
        print('')

정답은 맞지만, 아래쪽 출력에서 줄바꿈 처리 때문에 조건문이 들어가고 end=''가 많아져서 코드가 지저분해진다.


개선 아이디어

1) 공백 계산을 더 단순하게

이 문제는 전체 길이(2*n-1)를 쓰지 않아도 된다.

  • i번째 줄(0부터 시작)에서 공백 개수는 n-1-i
  • 별 개수는 2*i+1

2) 출력은 join으로 한 번에

print(..., end='')를 섞기 시작하면 마지막 줄 개행 같은 예외처리가 생긴다.
각 줄 문자열을 리스트에 모아두고 마지막에 "\n".join(lines)로 출력하면 깔끔해진다.


최종 코드 (추천)

import sys
input = sys.stdin.readline

n = int(input().strip())
lines = []

# 위쪽 (0 ~ n-1): 공백 감소, 별 증가
for i in range(n):
    lines.append(" " * (n - 1 - i) + "*" * (2 * i + 1))

# 아래쪽 (n-2 ~ 0): 공백 증가, 별 감소
for i in range(n - 2, -1, -1):
    lines.append(" " * (n - 1 - i) + "*" * (2 * i + 1))

print("\n".join(lines))

이번 문제로 배운 것 정리

  • 패턴 문제는 “전체 길이”로 일반화하기보다, 인덱스 i 기준으로 공백/별 규칙을 직접 쓰면 더 단순해진다.
  • 출력은 end=''를 많이 쓰기보다, 줄 문자열을 모아 "\n".join()으로 한 번에 출력하면 예외처리가 사라져 코드가 깔끔해진다.
  • sys.stdin.readline 패턴도 함께 쓰면 코딩테스트에서 입력 처리 습관을 통일할 수 있다.



pythonimplementationstringpattern Share Tweet +1