[BOJ][⚪1][백준#02447] 별 찍기 - 10
작성:    
업데이트:
카테고리: BOJ Silver I
태그: BOJ, BOJ Silver, PS, Python
문제 출처
문제
재귀적인 패턴으로 별을 찍어 보자. 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번째 줄까지 별을 출력한다.
예제
입력
27
출력
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
********* *********
* ** ** * * ** ** *
********* *********
*** *** *** ***
* * * * * * * *
*** *** *** ***
********* *********
* ** ** * * ** ** *
********* *********
***************************
* ** ** ** ** ** ** ** ** *
***************************
*** ****** ****** ***
* * * ** * * ** * * *
*** ****** ****** ***
***************************
* ** ** ** ** ** ** ** ** *
***************************
My Sol
def foo(ni, nj, nl):
if nl==3:
global mat
for i in range(3):
for j in range(3):
if i==1 and j==1: continue
mat[ni+i][nj+j]='*'
return
tl = nl//3
for i in range(ni, ni+3*tl, tl):
for j in range(nj, nj+3*tl, tl):
if i==ni+tl and j==nj+tl: continue
foo(i, j, tl)
return
L = int(input())
mat = [[' ']*L for _ in range(L)]
foo(0, 0, L)
for lst in mat:
print(*lst, sep='')
for문을 이용해 전체를 3x3등분한 뒤, 중앙에 해당하는 인덱스일 때 출력을 넘어가는 방식을 활용한다. 최초 배열을 초기화해주는데, 크기가 최대 3의 7승, 즉 2000을 조금 넘기는 수준이므로, LxL이 최대 40000칸으로 충분히 시간적으로 가능한 방식이라고 생각했다.
길이가 3이 된다면 최소 단위이므로 for문을 이용해 별을 중앙만 빼고 집어넣고 return한다. 이 최소 단위를 또 중앙 주변으로 두르고, 다시 이를 최소단위로 하여 또 두르면서 커진다.
결과
맞았습니다!!
모범답안
def append_star(LEN):
if LEN == 1:
return ['*']
Stars = append_star(LEN//3)
L = []
for S in Stars:
L.append(S*3)
for S in Stars:
L.append(S+' '*(LEN//3)+S)
for S in Stars:
L.append(S*3)
return L
n = int(input())
print('\n'.join(append_star(n)))
실행시간과 코드길이 모두 짧은 코드이다. 너무도 신박하게 문제를 해결하셨다. 처음부터 배열의 크기를 최대로 초기화한 것이 아니라, 최소단위가 된다면 리스트에 [*]을 추가하는 방식이고, 재귀와 for문을 이용해 일차원 같은 다차원 리스트를 만들어주었다.
길이가 3이면 [*]을 단위로, 기본 단위를 만들어 이를 L에 추가하다가 반환하고, 이를 다시 단위로 또 단위를 만드는 방식을 사용하여 배열을 확장하며 풀으셨다.
댓글남기기