정수 N이 주어지면 반쪽 높이가 N인 가운데 정렬 별 다이아몬드를 출력하는 프로그램을 작성한다. 위쪽은 높이 N의 피라미드, 아래쪽은 높이 N-1의 역피라미드 형태로 출력한다.
입력 예시
첫째 줄에 정수 N이 주어진다. (0 <= N <= 10)
출력 예시
반쪽 높이가 N인 가운데 정렬 별 다이아몬드를 출력한다.
예제 테스트케이스
예제 1
0
예제 2
1
*
예제 3
2
*
***
*
예제 4
3
*
***
*****
***
*
정답 코드
N = int(input())
for i in range(1, N + 1):
print(" " * (N - i) + "*" * (i * 2 - 1))
for i in range(1, N):
print(" " * i + "*" * ((N - i) * 2 - 1))
1. 코드 설명
이 코드는 다이아몬드를 위쪽과 아래쪽으로 나누어 출력한다.
첫 번째 반복문은 높이 N의 피라미드를 만들고, 두 번째 반복문은 높이 N-1의 역피라미드를 만들어 그 아래에 붙인다.
즉, 위에서부터 별 개수가 1, 3, 5, ...처럼 늘어나고, 가운데를 지난 뒤에는 다시 ..., 5, 3, 1처럼 줄어들게 만드는 구조이다.
먼저
N = int(input())
에서 N을 입력받는다. input()은 한 줄을 문자열로 입력받고, int()는 그것을 정수로 바꾼다.
이 문제에서 N은 다이아몬드의 반쪽 높이이므로, 위쪽은 N줄, 아래쪽은 N-1줄이 출력된다.
그다음 첫 번째 반복문이 위쪽 피라미드를 출력한다.
for i in range(1, N + 1):
print(" " * (N - i) + "*" * (i * 2 - 1))
여기서 range(1, N + 1)이므로 i는 1부터 N까지 변한다.
즉 첫 줄부터 가운데 줄까지 한 줄씩 만드는 반복문이다.
각 줄에서 앞 공백 개수는 N - i이고, 별 개수는 i * 2 - 1이다.
- i = 1이면 공백은 N-1개, 별은 1개
- i = 2이면 공백은 N-2개, 별은 3개
- i = 3이면 공백은 N-3개, 별은 5개
이렇게 공백은 한 칸씩 줄고, 별은 두 개씩 늘어난다.
" " * (N - i)처럼 문자열에 정수를 곱하면 그 문자열이 반복되고, "*" * (i * 2 - 1)도 같은 원리로 별 여러 개를 한 번에 만들 수 있다.
예를 들어 N = 3이면 위쪽 반복은 다음처럼 된다.
- i = 1 → " " * 2 + "*" * 1 → " *"
- i = 2 → " " * 1 + "*" * 3 → " ***"
- i = 3 → " " * 0 + "*" * 5 → "*****"
즉 위쪽은
*
***
*****
가 된다.
그다음 두 번째 반복문이 아래쪽 역피라미드를 출력한다.
for i in range(1, N):
print(" " * i + "*" * ((N - i) * 2 - 1))
여기서 range(1, N)이므로 i는 1부터 N-1까지 변한다.
즉 가운데 줄 바로 아래부터 마지막 줄까지 출력하는 반복문이다.
이 부분에서는 앞 공백 개수가 i이고, 별 개수는 (N - i) * 2 - 1이다.
- i = 1이면 공백은 1개, 별은 (N-1)*2-1개
- i = 2이면 공백은 2개, 별은 (N-2)*2-1개
즉 이번에는 공백이 한 칸씩 늘고, 별은 두 개씩 줄어든다.
그래서 위쪽과 정확히 반대 방향으로 줄어드는 모양이 만들어진다.
예를 들어 N = 3이면 아래쪽 반복은 다음처럼 된다.
- i = 1 → " " * 1 + "*" * 3 → " ***"
- i = 2 → " " * 2 + "*" * 1 → " *"
즉 아래쪽은
***
*
가 된다.
따라서 전체 출력은
*
***
*****
***
*
가 되어 가운데 정렬된 다이아몬드가 완성된다.
이 코드의 장점은 위쪽과 아래쪽이 대칭이라는 점이 식에서 바로 드러난다는 것이다.
위쪽은 공백 감소, 별 증가, 아래쪽은 공백 증가, 별 감소로 나뉘어 있어서 직접 작성할 때도 구조를 떠올리기 쉽다.
또 N = 0일 때도 따로 예외 처리할 필요가 없다.
첫 번째 반복문 range(1, 1)은 실행되지 않고, 두 번째 반복문 range(1, 0)도 실행되지 않으므로 아무것도 출력하지 않고 끝난다.
이것이 문제 조건과 맞는다.
2. 실수하기 쉬운 부분
아래쪽 반복을 range(1, N + 1)로 쓰는 경우
# 잘못된 코드
for i in range(1, N + 1):
print(" " * i + "*" * ((N - i) * 2 - 1))
아래쪽은 N-1줄만 출력해야 하므로 range(1, N)이어야 한다.
위쪽 별 개수를 i * 2 + 1로 쓰는 경우
# 잘못된 코드
for i in range(1, N + 1):
print(" " * (N - i) + "*" * (i * 2 + 1))
첫 줄부터 별이 3개가 되어 전체 모양이 문제와 다르게 커진다.
아래쪽 공백 개수를 N - i로 쓰는 경우
# 잘못된 코드
for i in range(1, N):
print(" " * (N - i) + "*" * ((N - i) * 2 - 1))
아래쪽도 위쪽처럼 출력되어 다이아몬드가 아니라 모양이 어긋난다.
N = 0일 때 별을 출력하는 경우
# 잘못된 코드
if N == 0:
print("*")
문제에서 N = 0이면 아무것도 출력하지 않아야 한다.
3. 핵심 정리
이 문제는 다이아몬드를 위쪽 피라미드와 아래쪽 역피라미드로 나누어 생각하면 쉽게 풀린다.
위쪽은 공백 = N-i, 별 = 2i-1, 아래쪽은 공백 = i, 별 = 2(N-i)-1로 두면 가운데 정렬된 다이아몬드를 자연스럽게 만들 수 있다.
'Univ > Python Programming' 카테고리의 다른 글
| [파이썬] 2번. 대문자, 소문자, 숫자 개수 세기 (0) | 2026.06.10 |
|---|---|
| [파이썬] 1번. 특정 문자 개수 세기 (0) | 2026.06.10 |
| [문제 17] 두 문자열의 공통 문자 찾기 - Python 풀이 (0) | 2026.04.17 |
| [문제 16] 주어진 숫자에서 소수 - Python 풀이 (0) | 2026.04.17 |
| [문제 15] 문자열에서 모음과 자음 세기 - Python 풀이 (1) | 2026.04.16 |