본문 바로가기
백준

[백준] 2447번 : 별 찍기 - 10 - 파이썬(Python) - 우당탕탕 개발자 되기 프로젝트

by 우당탕탕 개발자 2023. 12. 16.
728x90
반응형

 

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

 

1. 문제 설명

2. 풀이과정

해당 문제는 동일한 패턴을 가진 별의 모양을 크기에 맞춰 출력하는 문제이다.

가장 기초 패턴인 3일 때의 패턴이 계속 반복되므로 해당 패턴을 반복하여 출력해야 한다.

전체 패턴을 3개의 층으로 구분하여 보면, 제일 위에는 동일한 패턴이 3번 반복되고, 그 아래층은 패턴 + 공백 + 패턴으로 이루어지고, 마지막으로 가장 아래층은 패턴이 3번 반복되는 것을 볼 수 있다.

하여 3일 때의 패턴을 가지고 9일 때의 출력을 구성하고, 그 패턴을 가지고 27일 때의 출력을 구상하고 계속적으로 이전에 출력되는 구성을 패턴으로 삼아 다음 출력을 구성하면 된다.

 

  1. sys.stdin.readline() 함수를 사용하기 위해 sys 모듈을 불러온다. import sys
  2. 찍을 별을 리스트로 구할 함수를 정의한다. def star(n)
  3. 인수로 들어온 정수가 3이면 if (n == 3)
  4. 3일 때의 기본 패턴이 한 줄씩 저장된 리스트를 반환한다. return ['***', '* *', '***']
  5. 정수가 3이 아니면 해당 수를 3으로 나눈 몫을 함수에 다시 넣어 해당 반환 결과를 패턴으로 저장한다. (이전 출력을 패턴으로 삼음) pattern = star(n // 3)
  6. 최종적으로 출력할 별의 모양을 저장할 리스트를 생성한다. li = list()
  7. 패턴을 하나씩 불러오며 for p in pattern
  8. 처음에 제일 윗부분에는 패턴이 동일하게 3번 반복된다. li.append(p * 3)
  9. 그다음으로 패턴을 하나씩 불러오며 for p in pattern
  10. 중간 부분에는 패턴 + 공백 + 패턴의 결과가 나타난다. li.append(p + ' ' * (n // 3) + p)
  11. 마지막으로 패턴을 하나씩 불러오며 for p in pattern
  12. 첫 윗부분과 동일하게 패턴이 3번 반복된다. li.append(p * 3)
  13. 최종적으로 각 줄별 출력할 내용을 담은 리스트를 반환해 준다. return li
  14. 정수를 하나 입력받고 N = int(sys.stdin.readline())
  15. 해당 정수를 정의한 함수에 넣어 반환된 리스트 결과를 줄 바꿈 문자로 연결시켜 출력해 준다. print('\n'.join(star(N)))
반응형

3. 소스코드

import sys

def star(n):
    if (n == 3):
        return ['***', '* *', '***']
        
    pattern = star(n // 3)
    li = list()

    for p in pattern:
        li.append(p * 3)

    for p in pattern:
        li.append(p + ' ' * (n // 3) + p)

    for p in pattern:
        li.append(p * 3)
        
    return li

N = int(sys.stdin.readline())

print('\n'.join(star(N)))
728x90
반응형