sm 기술 블로그
73. 2447 (별 찍기 - 10) 본문
좀 어려웠다..
처음에
n = int(input())
result = ""
# 1. 함수정의
def star(x, y, n):
global result
if(x // n) % 3 == 1 and (y // n) % 3 == 1:
# x, y를 현재 n값에 나누고 그 값의 3의 나머지가 1일 때
result += " "
elif n == 1:
# 위 조건에 만족하지 않고 n이 1/3 까지 오면 별 출력
result += "*"
else:
star(x, y, n//3)
# n을 3으로 나누고, 함수 재호출
# 2. 계산 시작
for x in range(n):
for y in range(n):
star(x, y, n)
result += "\n"
print(result)
을 이용하였다.
행,열이 3의 나머지가 1이면 비어있다는 성질을 이용하여 풀었으나, 출력은 정상적으로 나오지만 시간초과가 발생한다. (반복문이 많아서...)
그래서 반복문은 적게 쓰고 한번에 그리는 방법을 생각해 보았다.
n = int(input())
def draw_star(n):
# n이 1일때 = n이 더이상 3으로 나눠질 수 없을 때
if n == 1:
return ["*"]
# n이 1이 될때 까지 실행
stars = draw_star(n//3)
result = []
# 3n + 1번째 줄
for first in stars:
result.append(first*3)
# 3n + 2번째 줄
for second in stars:
result.append(second + " "*(n//3) + second)
# 3n + 3번째 줄
for third in stars:
result.append(third*3)
return result
print("\n".join(draw_star(n)))
stars 3에서 3 x 3의 그림을 하나 그리게 된다.
그 그림은 result 9의 stars에 저장되고 first, second, third를 진행하면서
result 9에서 리스트 [0, 1, 2]번은 *3을 한 것(first) 이고, [3, 4, 5]번은 stars + 공백 + stars(second) 를,
[6,7,8]번은 *3을 했다(third).
result를 재귀함수 안에서 초기화 해주어 처음에 들어갔던 값은 무시된다.
second + " "*(n//3) + second 수식에 대해 설명하면, second에 stars:9와 매치를 시키면 된다
(1)
처음에는 ***가 second에 들어간다.
second + " "*(n//3) + second => *** + " "*(n//3) + ***이 된다. n은 9 이기 때문에 3이나온다.
즉, 공백이 3칸이라는 것이다.
second의 첫 리스트 *** ***이 만들어 졌다.
(2)
두번째는 * *이 seconde에 들어간다.
second + " "*(n//3) + second => * *+ " "*(n//3)+* * 이 된다. 마찬가지로 n은 9이기 때문에 공백이 3칸 들어간다.
second의 두번째 리스트 * * * *이 만들어 졌다.
(3)
세번째는 ***이 second에 들어간다.
(1)과 동일하므로 생략한다.
'문제 > 백준_파이썬' 카테고리의 다른 글
75. 2798(블랙잭) (0) | 2022.06.08 |
---|---|
74. 11729(하노이 탑 이동 순서) (0) | 2022.06.08 |
72. 17478 (재귀함수가 뭔가요?) (0) | 2022.06.06 |
71. 10870(피보나치수열) (0) | 2022.06.06 |
70. 10872 (팩토리얼) (0) | 2022.06.06 |