2022-10-29-#12447-별찍기1
[문제]
패턴으로 별을 찍어보자. N이 3의 거듭제곱이라고 할 때, 크기가 N의 패턴은 NXN 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.
1
2
3
***
* *
***
N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 NXN 정사각형 크기 N/3의 패턴으로 둘러싼 형태이다. 예를 들어 크기 27의 패턴은 예제 출력 1과 같다.
[입력]
첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 K에 대해 N=3^K 이며, 이때 1 ≤ K ≤ 8 이다.
[출력]
첫째 줄부터 N번째 줄까지 별을 출력한다.
[풀이]
어째 산 넘어 산이라는 생각이 든다 .. 그치만 꺾이지 않는 마음으로 .. 구겨진 미간을 잠시 풀면서 차근 차근 풀도록 하자. 출제자는 말씀하셨지. 먼저 n이 9일때부터 직접 그려보자고. 바로 그려보자 !
1
2
3
4
5
6
7
8
9
*********
* ** ** *
*********
*** ***
* * * *
*** ***
*********
* ** ** *
*********
N=9일 경우,
3*3의 박스 = 총 8개(N - 1)
필요한 별의 개수 = 64개 (8*8)
접근방법 1
규칙을 파악하고 식을 세워서 접근 !
⇒ 제지 당함.(현실적으로 3*8승에 쓰인 별의 개수가 몇 개인지 파악이 안 되어서 규칙 파악 불가 ..)
접근방법 2
처음부터 n*n의 matrix를 만들고 거기에 별을 채워넣는 형식으로 풀자.
말은 쉽지만 벌써부터 숨이 턱 하고 막히는 것이 어디서부터 손을 대야 할 지 모를 수 있다.
그렇다면 우선 3x3을 그릴때 어떻게 해야할지 생각해보자 !
1
2
3
4
big = []
big.append(['*']*3)
big.append(['*',' ', '*'])
big.append(['*']*3)
1
2
#result
[['*', '*', '*'], ['*', ' ', '*'], ['*', '*', '*']]
함수를 짠 것은 아니지만,
대충 그리게 된다면 저런 형태로 그리는 것이라는 점만 인지하고 본격적으로 ‘재귀함수’를 이용하여 N개를 그릴 경우를 생각해보자.
[코드]
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
def draw(n):
if n==1:
return ['*']
stars = draw(n//3)
big = [] #각 행마다 들어갈 요소를 저장
'''
각 줄에 들어갈 요소들이 점차 추가되는 형태
각 줄에 들어가는 별의 개수는 3으로 나누어줌으로써
매 turn마다 별이 추가되도록 !
'''
#첫 번째 줄
for star in stars:
big.append(star*3)
#print('1',big)
'''
1 ['*********']
1 ['*********', '* ** ** *']
1 ['*********', '* ** ** *', '*********']
'''
#두 번째 줄
for star in stars:
big.append(star+' '*(n//3)+star)
#print('2',big)
'''
2 ['*********', '* ** ** *', '*********', '*** ***']
2 ['*********', '* ** ** *', '*********', '*** ***', '* * * *']
2 ['*********', '* ** ** *', '*********', '*** ***', '* * * *', '*** ***']
'''
#세 번째 줄
for star in stars:
big.append(star*3)
#print('3', big)
'''
3 ['*********', '* ** ** *', '*********', '*** ***', '* * * *', '*** ***', '*********']
3 ['*********', '* ** ** *', '*********', '*** ***', '* * * *', '*** ***', '*********', '* ** ** *']
3 ['*********', '* ** ** *', '*********', '*** ***', '* * * *', '*** ***', '*********', '* ** ** *', '*********']
'''
#print('total', big)
return big
n = int(input())
print('\n'.join(draw(n)))
한 줄 씩 각각의 ‘*’은 마지막에 넣어주고 한 줄씩 그 틀을 짠다는 생각을 하면 이해가 훨씬 쉬울 것이다. « 사실 이해하는게 제일 어려움..
📌things that you can get from this problem
- case를 나누지 않고, 재귀 함수를 사용하는 문제를 풀어보니 색다른 것 같다..(=더 어렵다는 뜻이다..)
- .join(): join에 넣어준 파라미터와 join 앞에 붙는 string 형태를 같이 묶어준다.
- 재귀 .. 익숙해지려면 한참 멀었다…