문제
풀이
재미있는 문제이기도 하고 내가 어떻게 생각했는지, 생각한 과정이 어떻게 되는 지 공유하고자 한다.
개인적인 생각이라, 더 좋은 방법이 있을 수 있다.
먼저 별을 찍을 2차원 리스트를 하나 만든다. 이 2차원 리스트는 공백(space)을 기본으로 갖는다.
n = int(input())
arr = [[' ' for _ in range(n)]for _ in range(n)]
그 다음 비슷한 패턴이 반복 된다는 것을 알 수 있다. 패턴은 밑의 그림과 같은데
def star():
star() #1
star() #2
star() #3
star() #4
star() #5
star() #6
star() #7
star() #8
그 다음 각 칸의 간격을 생각해 본다. 간격은 항상 3의 제곱이다. 이 간격을 gap이라는 변수로 치환해 보자. 그러면 위의 패턴에서 왼쪽 위 칸의 좌표를 x,y로 생각한다면 모든 칸의 좌표는 밑의 그림처럼 된다.
def star(x,y,gap):
star(x, y, gap) #1
star(x+gap, y, gap) #2
star(x+gap*2, y, gap) #3
star(x, y+gap, gap) #4
star(x+gap*2, y+gap, gap) #5
star(x, y+gap*2, gap) #6
star(x+gap, y+gap*2, gap) #7
star(x+gap*2, y+gap*2, gap) #8
이제 위 그림의 한 칸은 아홉 개로 분할 되어 계속 같은 패턴을 찍을 것이다.gap을 3개로 분할 시키면 아홉 개로 분할 된 각 칸의 간격이 된다.
def star(x,y,gap):
gap//=3
star(x, y, gap) #1
star(x+gap, y, gap) #2
star(x+gap*2, y, gap) #3
star(x, y+gap, gap) #4
star(x+gap*2, y+gap, gap) #5
star(x, y+gap*2, gap) #6
star(x+gap, y+gap*2, gap) #7
star(x+gap*2, y+gap*2, gap) #8
별을 찍을 2차원 arr를 넣어 주자.
def star(arr, x, y, gap):
gap //= 3
star(arr, x, y, gap)
star(arr, x+gap, y, gap)
star(arr, x+gap*2, y, gap)
star(arr, x, y+gap, gap)
star(arr, x+gap*2, y+gap, gap)
star(arr, x, y+gap*2, gap)
star(arr, x+gap, y+gap*2, gap)
star(arr, x+gap*2, y+gap*2, gap)
마지막으로 gap의 값이 0, 즉 더 이상 이 칸을 분할할 수 없다면(arr[x][y]인 한 요소만을 가리킨다면,) x,y 자리에 별을 찍게 만든다.
def star(arr, x, y, gap):
if gap == 0:
arr[y][x] = '*'
return
gap //= 3
star(arr, x, y, gap)
star(arr, x+gap, y, gap)
star(arr, x+gap*2, y, gap)
star(arr, x, y+gap, gap)
star(arr, x+gap*2, y+gap, gap)
star(arr, x, y+gap*2, gap)
star(arr, x+gap, y+gap*2, gap)
star(arr, x+gap*2, y+gap*2, gap)
이러면 별을 찍는 함수가 완성된다.
완성된 코드
def star(arr, x, y, gap):
if gap == 0:
arr[y][x] = '*'
return
gap //= 3
star(arr, x, y, gap)
star(arr, x+gap, y, gap)
star(arr, x+gap*2, y, gap)
star(arr, x, y+gap, gap)
star(arr, x+gap*2, y+gap, gap)
star(arr, x, y+gap*2, gap)
star(arr, x+gap, y+gap*2, gap)
star(arr, x+gap*2, y+gap*2, gap)
n = int(input())
arr = [[' ' for _ in range(n)]for _ in range(n)]
star(arr, 0, 0, n)
for i in arr:
print(''.join(i))
출력해 본 결과이다.
댓글
댓글 쓰기