본문 바로가기

파이썬(문제풀이)

파이썬 모래시계 패턴 별찍기

 

더보기

모래시계 모양의 별표를 여러 가지 파이썬 코딩 방식으로 만들어 보자.

#1. 가장 단순한 방식으로 

def print_hourglass_pattern():
    print("*******")
    print(" *****")
    print("  ***")
    print("   *")
    print("  ***")
    print(" *****")
    print("*******")
print_hourglass_pattern()

 

더보기

위 코드는 하드코딩(Hard-coding) 방식으로 모래시계 패턴을 출력하는 함수이다. 각 줄의 공백과 별표를 직접 문자열로 입력하여 print() 함수를 7번 호출하는 간단한 구조로 되어 있다.

코드 분석


1. 함수 정의 (def print_hourglass_pattern():)

print_hourglass_pattern이라는 이름의 함수를 정의합니다. 이 함수는 어떤 값도 입력받지 않고 단순히 정해진 패턴을 출력하는 역할만 합니다.

2. 출력문 (print())

함수 안에는 총 7개의 print() 문이 있습니다. 각 print() 문은 하나의 줄을 출력하며, 쌍따옴표(") 안에 있는 문자열을 그대로 화면에 표시합니다.

  • 첫 번째 줄: "*******"은 별표 7개를 출력합니다.
  • 두 번째 줄: " *****"은 공백 1개와 별표 5개를 출력합니다.
  • 세 번째 줄: " ***"은 공백 2개와 별표 3개를 출력합니다.
  • 네 번째 줄: " *"은 공백 3개와 별표 1개를 출력합니다. 이 줄은 모래시계의 가장 좁은 중간 부분을 나타냅니다.
  • 다섯 번째 줄부터 마지막 줄까지: 위쪽 절반과 대칭을 이루도록 별표와 공백의 개수가 다시 늘어납니다.

3. 함수 호출 (print_hourglass_pattern())

마지막 줄에 있는 print_hourglass_pattern() 코드가 함수를 실행합니다. 이 줄이 없으면 함수는 정의만 될 뿐 실제로 아무것도 출력되지 않습니다.

장단점


  • 장점:
    • 매우 직관적이고 이해하기 쉽습니다. 코드를 보면 어떤 모양이 출력될지 바로 알 수 있습니다.
    • 별도의 계산이나 반복문이 필요 없어 단순합니다.
  • 단점:
    • 유연성이 없습니다. 만약 모래시계의 크기를 바꾸고 싶다면, 모든 print() 문을 수동으로 수정해야 합니다. 예를 들어, 9줄짜리 모래시계를 만들려면 코드를 완전히 새로 작성해야 합니다.
    • 패턴이 복잡해질수록 코드가 길어지고 비효율적입니다. 반복되는 패턴을 다룰 때는 for 루프나 다른 동적인 방법을 사용하는 것이 훨씬 효율적입니다.

#2. 두 개의 반복문(for loop)을 사용한 방법

위쪽 절반과 아래쪽 절반을 각각 별도의 반복문으로 구현하는 가장 직관적인 방식이다.

def print_hourglass_with_two_loops():
    # 위쪽 절반 (별이 줄어드는 부분)
    for i in range(4, 0, -1):
        spaces = 4 - i
        stars = (2 * i) - 1
        print(" " * spaces + "*" * stars)

    # 아래쪽 절반 (별이 늘어나는 부분)
    for i in range(2, 5):
        spaces = 4 - i
        stars = (2 * i) - 1
        print(" " * spaces + "*" * stars)

print_hourglass_with_two_loops()

 

더보기

위 코드는 두 개의 for 반복문을 사용하여 모래시계 패턴을 동적으로 생성하고 출력하는 함수입니다. 하드코딩 방식과 달리, 반복적인 계산을 통해 패턴을 만들어 유연성을 높인 것이 특징입니다.

코드 분석


1. 함수 정의 (def print_hourglass_with_two_loops():)

print_hourglass_with_two_loops라는 함수를 정의합니다. 함수 이름에서 알 수 있듯이, 두 개의 반복문을 사용해 모래시계 모양을 출력하는 역할을 합니다.

2. 첫 번째 반복문 (위쪽 절반)

    for i in range(4, 0, -1):
        spaces = 4 - i
        stars = (2 * i) - 1
        print(" " * spaces + "*" * stars)
  • for i in range(4, 0, -1):: 이 반복문은 i가 4, 3, 2, 1 순서로 변하도록 설정되었습니다. range(start, stop, step)에서 step이 -1이므로 숫자가 감소하며 반복합니다.
  • spaces = 4 - i: 이 줄은 각 줄의 앞에 올 공백의 개수를 계산합니다. i가 4일 때 공백은 0개, i가 3일 때 1개, i가 2일 때 2개, i가 1일 때 3개가 됩니다.
  • stars = (2 * i) - 1: 이 줄은 각 줄에 올 별의 개수를 계산합니다. 별의 개수는 항상 홀수이며, i가 4일 때 7개, 3일 때 5개, 2일 때 3개, 1일 때 1개가 되어 별의 수가 점차 줄어드는 위쪽 삼각형 모양을 만듭니다.
  • print(" " * spaces + "*" * stars): 계산된 공백 문자열과 별표 문자열을 합쳐서 한 줄을 출력합니다. " " * spaces는 공백을 spaces 개만큼, "*" * stars는 별표를 stars 개만큼 반복합니다.

3. 두 번째 반복문 (아래쪽 절반)

    for i in range(2, 5):
        spaces = 4 - i
        stars = (2 * i) - 1
        print(" " * spaces + "*" * stars)
  • for i in range(2, 5):: 이 반복문은 i가 2, 3, 4 순서로 변하도록 설정되었습니다. 첫 번째 반복문이 끝난 후 모래시계의 아랫부분을 그리기 시작합니다.
  • **spaces = 4 - i**와 stars = (2 * i) - 1: 위쪽 절반과 동일한 계산식을 사용합니다.
    • i가 2일 때 공백 2개, 별 3개
    • i가 3일 때 공백 1개, 별 5개
    • i가 4일 때 공백 0개, 별 7개
  • 이로써 별의 수가 다시 늘어나는 아래쪽 삼각형 모양이 만들어집니다.

4. 함수 호출 (print_hourglass_with_two_loops())

마지막 줄에서 함수를 호출하여 코드를 실행하고, 최종적으로 완전한 모래시계 패턴이 화면에 출력됩니다.

이 방식은 패턴의 규칙을 수식화하여 코드를 더 효율적이고 유연하게 만든 좋은 예시입니다. 만약 모래시계의 크기를 바꾸고 싶다면, range() 함수의 시작과 끝 값만 수정하면 됩니다.

#3. 별표 개수를 리스트에 저장하여 반복하는 방법

만들고자 하는 패턴이 명확할 때, 각 줄의 별표 개수를 리스트에 저장해두고 순서대로 출력하는 방법입니다. 코드가 간결하고 이해하기 쉽습니다.

def print_hourglass_with_list():
    # 각 줄에 출력할 별의 개수를 리스트로 정의
    stars_per_line = [7, 5, 3, 1, 3, 5, 7]   
    # 리스트를 순회하며 별과 공백 출력
    for num_stars in stars_per_line:
        # 전체 너비를 7로 가정하고 공백 개수를 계산
        spaces = (7 - num_stars) // 2
        print(" " * spaces + "*" * num_stars)
print_hourglass_with_list()

 

더보기

이 코드는 리스트를 사용하여 모래시계 패턴을 만드는 효율적인 방법입니다. 패턴의 각 줄에 필요한 별의 개수를 미리 정의하고, 반복문을 통해 그 리스트를 순회하며 출력하는 방식이죠.

코드 분석


1. 함수 정의 (def print_hourglass_with_list():)

print_hourglass_with_list라는 함수를 정의합니다. 이 함수는 패턴의 핵심 데이터인 별의 개수를 리스트에 담아 처리한다는 것을 이름에서 알 수 있습니다.

2. 별표 개수 리스트 (stars_per_line = [7, 5, 3, 1, 3, 5, 7])

이 코드는 모래시계 패턴을 만드는 데 필요한 모든 별의 개수를 순서대로 리스트에 저장합니다. 첫 줄은 7개, 다음 줄은 5개, 3개, 1개... 이런 식으로 각 줄의 별 개수를 stars_per_line이라는 리스트에 담습니다. 이 리스트 자체가 곧 패턴의 설계도가 되는 셈입니다.

3. 반복문 (for num_stars in stars_per_line:)

for 반복문은 stars_per_line 리스트의 각 요소를 순서대로 num_stars 변수에 할당하며 반복합니다. 즉, num_stars는 7 → 5 → 3 → 1 → 3 → 5 → 7 순서로 값이 변합니다.

4. 공백 및 별표 계산 (spaces = (7 - num_stars) // 2와 print(" " * spaces + "*" * num_stars))

  • spaces = (7 - num_stars) // 2: 이 줄은 각 줄의 앞에 필요한 공백의 개수를 계산합니다. 전체 너비(7)에서 현재 줄의 별 개수(num_stars)를 뺀 뒤, 남은 공간을 절반으로 나누어 양쪽에 공백을 균등하게 배치합니다. 파이썬의 // 연산자는 몫만 구하는 정수 나눗셈으로, 소수점 이하를 버려 정확한 공백 개수를 만듭니다.
  • print(" " * spaces + "*" * num_stars): 계산된 공백 문자열(" " * spaces)과 별표 문자열("*" * num_stars)을 더해 한 줄을 완성한 후 출력합니다.

5. 함수 호출 (print_hourglass_with_list())

마지막 줄에서 함수를 호출하여 코드를 실행하고, 모래시계 패턴을 출력합니다.

이 방식의 특징


이 코드는 **데이터(별 개수)와 로직(출력 방식)**을 분리한 좋은 예시입니다. 하드코딩 방식처럼 각 줄을 일일이 입력하지 않아도 되며, 반복문 방식보다 복잡한 수식을 계산할 필요가 없어 코드가 더 명확합니다. 만약 다른 모양의 패턴을 만들고 싶다면, stars_per_line 리스트의 값만 수정하면 되므로 유지보수와 확장이 매우 용이합니다.

#4. 단일 반복문과 조건문을 사용한 방법

하나의 반복문으로 전체 모래시계 패턴을 만들 수 있습니다. 반복 횟수에 따라 별과 공백의 개수를 계산하는 복잡한 수식이 필요하지만, 코드가 더 동적입니다.

def print_hourglass_with_one_loop():
    # 총 7줄을 반복
    for i in range(7):
        if i <= 3:  # 위쪽 절반
            spaces = i
            stars = 7 - (2 * i)
        else:  # 아래쪽 절반
            spaces = 6 - i
            stars = 7 - (2 * spaces)
        
        print(" " * spaces + "*" * stars)
print_hourglass_with_one_loop()

 

더보기

위 코드는 단 하나의 for 반복문과 조건문(if-else)을 사용하여 모래시계 패턴을 만드는 효율적인 방법입니다. 패턴의 상단과 하단이 대칭적이라는 특징을 활용해, 반복 횟수에 따라 공백과 별표의 개수를 다르게 계산합니다.

코드 분석


1. 함수 정의 및 반복문

def print_hourglass_with_one_loop():는 print_hourglass_with_one_loop라는 함수를 정의합니다. for i in range(7):는 i가 0부터 6까지 7번 반복되도록 설정합니다. 이 i 값은 현재 출력할 줄의 인덱스 역할을 합니다.

2. 조건문 (if-else)

if i <= 3:

  • 이 조건문은 현재 줄 인덱스 i가 3 이하인지 확인합니다. i가 0, 1, 2, 3일 경우, 즉 모래시계의 위쪽 절반에 해당하는 4줄을 그릴 때 실행됩니다.
  • spaces = i: 줄 번호가 커질수록 공백이 늘어나는 규칙을 적용합니다. (i=0일 때 공백 0개, i=1일 때 공백 1개, ...)
  • stars = 7 - (2 * i): i가 커질수록 별의 개수가 줄어드는 규칙을 적용합니다. (i=0일 때 별 7개, i=1일 때 별 5개, ...)

else:

  • i가 4, 5, 6일 경우, 즉 모래시계의 아래쪽 절반에 해당하는 3줄을 그릴 때 실행됩니다.
  • spaces = 6 - i: 줄 번호가 커질수록 공백이 줄어드는 규칙을 적용합니다. (i=4일 때 공백 2개, i=5일 때 공백 1개, i=6일 때 공백 0개)
  • stars = 7 - (2 * spaces): spaces 변수를 사용하여 별의 개수를 계산합니다. 이 방식은 위쪽 절반의 계산식과 대칭을 이루어 별의 개수가 다시 늘어나는 패턴을 만듭니다.

3. 출력 (print(" " * spaces + "*" * stars))

if-else 블록에서 계산된 spaces와 stars 값을 사용하여 한 줄의 문자열을 조합하고 출력합니다.

4. 함수 호출 (print_hourglass_with_one_loop())

마지막 줄에서 함수를 호출하여 코드를 실행하고, 최종적으로 완전한 모래시계 패턴을 출력합니다.

이 방식의 장점


이 코드는 하나의 반복문만으로 전체 패턴을 완성할 수 있어 매우 간결합니다. 또한, 모래시계의 크기만 조절하면 다양한 크기의 모래시계를 만들 수 있어 유연성이 높습니다. 복잡한 패턴을 하나의 규칙으로 압축하여 표현하는 프로그래밍의 좋은 예시입니다.