Home BOJ-12447.별찍기1
Post
Cancel

BOJ-12447.별찍기1

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 형태를 같이 묶어준다.
  • 재귀 .. 익숙해지려면 한참 멀었다…
This post is licensed under CC BY 4.0 by the author.