백준 별 찍기 코드 및 해설 (파이썬)

2021. 9. 29. 10:35algorithm

반응형

https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

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

www.acmicpc.net

 

로그 함수 때문에 애 먹었다 

왜 그러는거야?

왜 log_3(81)은 4.0이고 log_3(243)은 4.99 라서 날 힘들게 만든거야!

int가 아니라 round를 써야 했다 

 

재귀함수를 사용했다.

 

[이전 모양 사각형] [이전 모양 사각형] [이전 모양 사각형]

[이전 모양 사각형] [ N/3 빈 정사각형] [이전 모양 사각형]

[이전 모양 사각형] [이전 모양 사각형] [이전 모양 사각형]

 

이런 모양이면 된다.

프린트를 어떻게 하는지 고민했는데

일단 리스트로 만들고 나서 프린트했다.

리스트의 각 row를 원하는 만큼 반복해주고 다 완성된 다음 한 줄씩 프린트 하는 방식으로~

 

 

import sys
import math

def stars(k):
	if k == 1:
		return ['***','* *', '***']
	else:
		result = []
		prev_stars = stars(k-1)
		# 이전 모양 3개 위에 쌓기 
		for row in prev_stars:
			result.append(row * 3)
		# 이전 모양 + (N/3 * N/3) 크기의 빈 사각형 + 이전 모양 
		for row in prev_stars:
			result.append(row + ' ' * int(3**(k-1)) + row)
		# 이전 모양 3개 아래에 쌓기
		for row in prev_stars:
			result.append(row * 3)
		return result

N = int(sys.stdin.readline())
# N = 81일 때 4.0, N = 243일 때 4.999 라서 int 아니고 round 해줘야 함 
k = round(math.log(N, 3))

for s in stars(k):
	print(s)
반응형