사용 언어: python 3.7.4
문제
n=3 일 때 별을 도장처럼 찍어간다고 생각했다.
규칙에 맞게 도장을 찍으면 될 거라고 생각했다.
하지만 출력에서 막혔다.
패턴이 담긴 리스트에서 별을 규칙에 맞게 출력하기 어려워 다른 접근법을 사용하게 되었다.
<나무와 함께 푼 풀이>
위아래 패턴(top_bottom)과 중간 패턴(middle)으로 쪼갠다.
위와 아래 패턴은 같은 모양이기 때문에, 위 패턴만 만들면 아래 패턴은 재사용할 수 있다.
패턴을 만들 때, 이전 별 모양(n//3 일 때)을 '한 줄씩' 가져와서 만든다.
# 기저
if n == 3:
return ['***','* *','***']
before_star = printStar(n//3) # 이전 별 모양
top_bottom의 첫째 줄은 이전 별 모양 첫째 줄*3이다.
top_bottom의 둘째 줄은 이전 별 모양 둘째 줄*3이다.
top_bottom의 셋째 줄은 이전 별 모양 셋째 줄*3이다.
코드를 보면 아래와 같다.
# 위, 아래 패턴. 둘은 같은 모양이다.
top_bottom = []
for i in range(n//3):
text = before_star[i]*3
top_bottom.append(text)
'''
>> print(top_bottom)
['*********', '* ** ** *', '*********']
'''
# 중간 패턴
middle = []
for i in range(n//3):
text = before_star[i]+ ' '*(n//3) + before_star[i]
middle.append(text)
'''
>> print(middle)
['*** ***', '* * * *', '*** ***']
'''
이때 리스트.append()를 써서 붙이면 차원이 늘어나게 되고, 그러면 출력하기 불편해진다.
대신 리스트.extend()를 사용하면 1차원을 유지하여 패턴을 붙일 수 있고, 그러면 for문을 한 번만 돌려 쉽게 출력할 수 있다.
results = []
results.extend(top_bottom)
results.extend(middle)
results.extend(top_bottom)
'''
>> print(results)
['*********', '* ** ** *', '*********', '*** ***', '* * * *', '*** ***', '*********', '* ** ** *', '*********']
'''
전체 코드는 아래 '2차 접근 코드(정답)'에 있다.
# 틀린 코드. n=27 부터도 뭔가 이상함
import sys
def printStar(n):
# 기저
if n == 3:
return ['***','* *','***']
results = []
for i in range(3):
for j in range(3):
if i == 1 and j == 1:
results.append([' '*(n//3)]*(n//3))
else:
results.append((printStar(n//3)))
for i in range(n//3):
for j in range(n//3):
print(results[j][i], end='')
print()
return results
n = int(sys.stdin.readline())
answer = printStar(n)
print('\n'.join(answer))
import sys
def printStar(n):
# 기저
if n == 3:
return ['***','* *','***']
results = []
before_star = printStar(n//3) # 이전 별 모양
# 위, 아래 패턴. 둘은 같은 모양이다.
top_bottom = []
for i in range(n//3):
text = before_star[i]*3
top_bottom.append(text)
# 중간 패턴
middle = []
for i in range(n//3):
text = before_star[i]+ ' '*(n//3) + before_star[i]
middle.append(text)
results.extend(top_bottom)
results.extend(middle)
results.extend(top_bottom)
return results
n = int(sys.stdin.readline())
answer = printStar(n)
print('\n'.join(answer))
a=int(input())
def s(n):
if n==3:return['***','* *','***']
x=s(n//3)
y=list(zip(x,x,x))
for i in range(len(y)):y[i]=''.join(y[i])
z=list(zip(x,[' '*(n//3)]*(n//3),x))
for i in range(len(z)):z[i]=''.join(z[i])
return y+z+y
print('\n'.join(s(a)))
correct
메모리 | 시간 | 코드길이 |
---|---|---|
41292 KB | 75 ms | 670 B |
O (NlogN)
재귀를 풀 때는 함수의 리턴값 모양을 만들어두자.
예시: 1차원 리스트 안에 문자열만 있는 형태로 만들기
-> 이런 식으로 형태가 고정적이어야 재귀 함수에서 활용 가능
첫번째 접근법 출력이 너무 어려워서 몇 시간동안 고생했다. 힘들었다.
그림자료가 있어서 이해가 더 잘 되네요!