[백준 2447 파이썬] - 별 찍기 - 10

zsunny·2022년 7월 4일
0

📌 문제

💯 정답

def draw(n):
    tmp =[]     					# 별 담을 빈 리스트
    for i in range(3 * len(n)):     # 별의 줄 수가 3배씩 늘어남
        if i // len(n) == 1:        # 몫이 1일때 즉 행렬의 3,4,5 범위는 공백이 들어감
            tmp.append(n[i%len(n)] + " " * len(n) + n[i%len(n)])
        else:
            tmp.append(n[i%len(n)] * 3)
    return tmp

star = ["***", "* *", "***"]    # N=3일때
N = int(input())
cnt = 0

while N != 3:       # N이 3이 아닌 경우 반복
    N = N // 3
    cnt += 1        # ex. N=27, cnt=2

for _ in range(cnt):	# cnt번 반복
    star = draw(star)   # 현재 별의 개수를 그 다음 함수의 인자로 넣음

for i in star:      # 리스트의 별 한줄씩 출력
    print(i)

📝 설명

• N이 3일때의 기본 별 패턴을 star리스트에 담는다.
• N이 3이 아닌경우 3이 될때까지 3으로 나눈 몫을 cnt에 담는다., N이 27이면 cnt는 2가 되고 '3의 패턴 --cnt=1--> 9의 패턴 --cnt=2--> 27의 패턴' 을 얻을 수 있게 된다.
• cnt만큼 별 패턴을 그리는 draw()함수를 호출하는데 이때 인자로 전 함수에서 수행되어 만들어진 패턴을 넣는다.
  (초기값은 star = ["***", "* *", "***"])
• draw()함수에서 만약 n이 9일때 tmp를 구해보면 다음과 같다.

  tmp = ["*********",	# 0		i//3=0	i%3=0	n[0]="***"
  		 "* ** ** *",	# 1		i//3=0	i%3=1	n[1]="* *"
         "*********",	# 2		i//3=0	i%3=2	n[0]="***"
         "***   ***",	# 3		i//3=0
         "* *   * *",	# 4		i//3=1
         "***   ***",	# 5		i//3=1
         "*********",	# 6		i//3=2	i%3=0	n[0]="***"
         "* ** ** *",	# 7		i//3=2	i%3=1	n[1]="* *"
         "*********"]	# 8		i//3=2	i%3=2	n[0]="***"
         
• 이렇게 만들어진 star리스트(tmp를 반환한)를 한 줄 씩 출력하면 된다.
profile
매일 성장하는 예비 웹 개발자 🌱

0개의 댓글