반응형
250x250
Notice
Recent Posts
Recent Comments
Link
«   2025/01   »
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
Tags more
Archives
Today
Total
관리 메뉴

멋진 개발자가 되고 싶다

[백준,Python] 2447. 별 찍기 - 10 (feat.재귀함수) 본문

Algorithm Study/백준

[백준,Python] 2447. 별 찍기 - 10 (feat.재귀함수)

오패산개구리 2021. 7. 2. 23:46
728x90
반응형

1. 문제 :

 

https://www.acmicpc.net/problem/2447

 

2447번: 별 찍기 - 10

재귀적인 패턴으로 별을 찍어 보자. N이 3의 거듭제곱(3, 9, 27, ...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다. 크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이

www.acmicpc.net

 

2. 알고리즘 :

 

n=3^1일 때

 

n=3^2일 때

 

 

n=3일 때와 n=3^2일 때의 별 찍기를 보면

n=3에서 *이 찍히는 패턴대로

n=3^2에서 'n=3일 때의 별의 배열'이 찍힌다.

 

 

이를 일반화 시켜서 표현하면

 

 

n=3^i일 때, 'n=3^(i-1)일 때의 별의 배열'이 찍힌다.

 

 

이것이 핵심 알고리즘이다.

 

 

아마 몇몇 분들은 이미 이러한 패턴을 알아차렸을지도 모른다.

하지만 우리 같은 초짜들은 패턴을 알아채더라도 어떻게 코드를 작성하여야 하는지가 너무 어렵다.

(그냥 나를 두고 하는 말이다 ㅋ..)

 

 

일단 코드를 보면서 내 것으로 만들어보자!

 

 

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
def draw_star(num):
    global Map
 
    if num == 3:
        Map[0][:3], Map[2][:3= ['*''*''*'], ['*''*''*']
        Map[1][:3= ['*'' ''*']
        return
    
    a = num//3
    draw_star(a)
    for i in range(3):
        for j in range(3):
            if i == 1 and j == 1:
                continue
            for k in range(a):
                Map[a*i+k][a*j:a*j+a] = Map[k][0:a] # 핵심!!
 
 
if __name__ == '__main__':
    N = int(input())
    # NxN 리스트 생성
    Map = [[' ' for i in range(N)] for i in range(N)]
    
    draw_star(N)
    
    # 최종 별 찍기 출력
    for i in Map:
        for j in i:
            print(j,end='')
        print('')
cs

 

중요한 부분만 설명하고 넘어가겠다.

 

 

우선 NxN개의 공백을 넣은 리스트를 만들었다.

(코드를 보면 알겠지만 가운데 공백을 표현하기 위해)

 

 

그리고 i == 1 and j == 1에 해당하는 부분은 가운데 공백에 해당한다.

 

 

그 외의 부분은 핵심 코드를 통해 처리해주면 된다.

 

728x90
반응형