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

hyewon9913·2024년 7월 10일

코딩테스트(python)

목록 보기
39/46

문제

처음 이 문제를 보았을때는 공백이 들어가야하는 부분의 규칙을 찾아서 공백을 넣어주면 된다고 생각했다.

나의 코드

n = int(input())
ans = [['*']*n for _ in range(n)]
# n이 3의 몇승인지 구함
k = 0
tmp = n
while(tmp > 1 ):
    tmp /=3
    k += 1

#3x3 사각형에 공백, 9x9 사각형에 공백 이런식이기 때문에 27이라면 3의 3승이므로 3번 반복
for l in range(1,k+1):
    sqt = 3**l
    for i in range(n):
        for j in range(n):
        #사각형의 시작점이라면
            if i % sqt == 0 and j % sqt == 0:
            	#해당 사각형의 중간부분을 공백 처리
                for x in range(0,sqt//3):
                    for y in range(0,sqt//3):
                        if i+x+sqt//3<n and j+y+sqt//3<n:
                            ans[i+x+sqt//3][j+y+sqt//3] = ' '

for i in range(n):
    for j in range(n):
        print(ans[i][j], end="")
    print()

이런식으로 직관적으로 숫자 규칙에 맞게 풀어주었다.

하지만 이 방법은 추천하지 않는다. 왜냐하면 python으로 선택했을 때에는 시간초과가 발생하였고 pypy3로 해야지 겨우 정답처리가 되었기 때문이다.

https://cotak.tistory.com/38

이 주소에 나온 방법을 참고하여 작성한 코드는

def draw_stars(n):
  if n==1:
    return ['*']

  Stars=draw_stars(n//3)
  answer=[]
  print(Stars)

  for star in Stars:
    answer.append(star*3)
    print(answer)
  for star in Stars:
    answer.append(star+' '*(n//3)+star)
  for star in Stars:
    answer.append(star*3)

  return answer

N=int(input())
print('\n'.join(draw_stars(N)))

이런식으로 재귀함수를 사용해 세 부분으로 나누어 별을 찍어주면 python으로 제출해도 시간초과가 뜨지 않는다.

코딩테스트 였다면 시간초과로 인해 점수를 못받을 수 도 있을 뻔한 문제였다.

더 최적화된 코드로 문제를 풀이하기 위해 많은 공부가 필요한 것 같다.

profile
차근차근 굴러가는 코딩일지

0개의 댓글