문제
재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.
크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3)×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
입력
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 N=3k이며, 이때 1 ≤ k < 8이다.
출력
첫째 줄부터 N번째 줄까지 별을 출력한다.
예제 입력 1
27
예제 출력 1
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
2시간동안 고민했지만 결국은 풀 수 없었다.ㅜ
결국 다른 사람들이 푼 것을 봤고, 그 중 젤 이해하기 쉬운 것으로 풀었다.
이분의 풀이 중 2번째 방법을 이해하고 코드를 짜봤다.
def draw_stars(n):
if n==1:
return ['*']
Stars=draw_stars(n//3)
L=[]
for star in Stars:
L.append(star*3)
for star in Stars:
L.append(star+' '*(n//3)+star)
for star in Stars:
L.append(star*3)
return L
N=int(input())
print('\n'.join(draw_stars(N)))
제일 먼저 재귀적인 방법으로 n을 1까지 도달하게 한다음 ['*']을 리턴해준다.
그러면 n=3일 때의 draw_starts(1)이 되므로 Starts는 ['*']이 되고 그 밑의 for문을 실행하게 된다.
총 3개의 for문을 ['*']로 돌렸을 때
L의 결과는 ['***', '* *', '***'] 이 된다.
처음에 손으로 하나씩 풀어봤을 때, 이해가 되지 않았다. 그 이유는 내가 *을 L 리스트의 요소 하나로 인식했기 때문이다.
실제로 '***'이 하나의 요소인데 '*','*',*' 이런식으로 이해해가지고 답을 풀어낼 수 없었다.
'***'을 하나의 요소로 이해하니 금방 해결됬다.
n=3일 때의 함수는 끝이나고 n=9일 때 넘어가니
첫번째 for문 결과는
['*********',
'* ** ** *',
'*********']
이 되었다. n=9일때의첫번째 줄이 완성된 것이다.
두번쨰 for문 결과로
['*** ***',
'* * * *',
'*** ***'] 이 L에 추가로 들어갔다.
마지막 세번째는 첫번째 for문과 같으므로
최종 결과는
['*********',
'* ** ** *',
'*********',
'*** ***',
'* * * *',
'*** ***',
'*********',
'* ** ** *',
'*********']
이 된다.
이런 순환이 재귀가 끝날 때까지 반복되고,
마지막 '\n'.join()함수를 써서 리스트의 요소를 붙이는데 요소를 붙일 때 \n(줄바꿈)을 써서 붙여주면 원하는 결과의 답이 나오게 된다.
'알고리즘' 카테고리의 다른 글
[백준 9663번] N-Queen in python (0) | 2021.11.02 |
---|---|
[백준 10989번] 수 정렬하기 3 in python (0) | 2021.11.01 |
병합 정렬 in python (0) | 2021.11.01 |
[백준 1018번] 체스판 다시 칠하기 in python (0) | 2021.10.29 |
[백준 11729번] 하노이 탑 이동 순서 in python (0) | 2021.10.29 |
댓글