본문 바로가기

Univ/Python Programming

[문제 04] 별로 다이아몬드 그리기 - Python 풀이

정수 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로 두면 가운데 정렬된 다이아몬드를 자연스럽게 만들 수 있다.