반응형
n을 입력하면 n줄에 해당하는 모양을 출력하면 되는 문제.
이전까지의 별찍기와는 달랐다. 나는 출력에만 고집해서 시간을 굉장히 많이 썼는데, 그게 상당히 어렵다는 것을 알게됐다.
모양을 배열로 접근해서 풀었어야 하는 문제.
예를 들어 n=3이면 3*5의 배열을 만들어야 한다.
* | ||||
* | * | |||
* | * | * | * | * |
그리고 다음 n=6이면, 6*11의 배열을 만들어야 한다.
* | ||||||||||
* | * | |||||||||
* | * | * | * | * | ||||||
* | * | |||||||||
* | * | * | * | |||||||
* | * | * | * | * | * | * | * | * | * |
중간을 기준으로 보면 첫번째 행의 *은 n=6일땐 5, n=3일때는 2이므로, n-1에 위치함을 알 수 있다. 그렇다면 다음 삼각형이 만들어지는 4번째 행의 위치는 어떤가? 첫번째 기준 값에서 각각 2만큼(n//2-1만큼) 떨어져 있음을 알 수 있다.
이를 통해 삼각형의 위쪽 꼭짓점을 기준으로 재귀를 만들어 볼 수 있다.
def shape(n,x,y):
if n==3:
result[x][y]="*"
result[x+1][y-1]=result[x+1][y+1]="*"
for t in range(-2,3):
result[x+2][y+t]="*"
else:
shape(n//2,x,y)
shape(n//2,x+n//2,y-n//2)
shape(n//2,x+n//2,y+n//2)
n=int(input())
result = [[" "]*2*n for x in range(n)]
shape(n,0,n-1)
for x in result:
print("".join(x))
반응형