문제 요약
입력으로 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패턴도 함께 쓰면 코딩테스트에서 입력 처리 습관을 통일할 수 있다.