ABC 357 C번 복기 - 시에르핀스키 패턴 그리는 재귀 연습

C - Sierpinski carpet (atcoder.jp)

 

C - Sierpinski carpet

AtCoder is a programming contest site for anyone from beginners to experts. We hold weekly programming contests online.

atcoder.jp

 

 

K = 0이면 1*1 검정색 사각형

 

K = 1이면 3*3 사각형에 가운데 1*1이 흰색인 사각형

 

K = N이면 .. $3^{K} * 3^{K}$인 사각형에서, $3^{K-1} * 3^{K-1}$로 9개 사각형을 나누고

 

K = N-1인 부분이 주위 8개 칸에 들어가고, 중간은 흰색 사각형으로만

 

 

 

K = 0이면 검정색 사각형 하나

 

def f(k):
    
    if k == 0:
        
        return ["#"]

 

 

k-1인 사각형을 불러오고

 

def f(k):
    
    if k == 0:
        
        return ["#"]
    
    sub = f(k-1)

 

 

현재 k의 사각형 크기는, k-1의 sub 패턴의 3배만큼 키워야하므로...

 

 

 

 

def f(k):
    
    if k == 0:
        
        return ["#"]
    
    sub = f(k-1)
    
    l = len(sub)
    
    pattern = [["." for _ in range(3*l)] for _ in range(3*l)]

 

 

 

그러면 sub 사각형을 pattern 내에 채워넣어야하는데, 8개 둘레부분에 그대로 집어넣어야하고,

 

중간 부분은 그대로 빈 상태로 두면 된다

 

(0,0) 위치에는 sub를 그대로 넣으면 된다

 

pattern[i][j] = sub[i][j]가 된다는 소리...

 

그런데 (1,0) 위치에 sub를 넣고 싶다면?

 

X축으로 len(sub)만큼 이동시킨 것이므로 pattern[i+len(sub)][j] = sub[i][j]

 

비슷하게 (1,2) 위치에 sub를 넣겠다면

 

X축으로 len(sub)만큼, Y축으로 2*len(sub)만큼 이동시켰으므로...

 

pattern[i+len(sub)][i+2*len(sub)] = sub[i][j] 처럼 넣으면 될 것

 

그런데 중간부분 (1,1)은 빈 상태로 두어야한다

 

 

 

def f(k):
    
    if k == 0:
        
        return ["#"]
    
    sub = f(k-1)
    
    l = len(sub)
    
    pattern = [["." for _ in range(3*l)] for _ in range(3*l)]
    
    for I in range(3):
        
        for J in range(3):
            
            if I != 1 or J != 1:
                
                for i in range(l):
                    
                    for j in range(l):
                        
                        pattern[i+I*l][j+J*l] = sub[i][j]
    
    
    return pattern

 

 

재귀 연습이 부족하긴 한가보다

 

막상 짤려고 하니까 짜질못하네

 

연습좀 해야할듯

 

시험볼때는 모르겠어서... K = 6까지밖에 안되니까, K = 2일때

 

#########
#.##.##.#
#########
###...###
#.#...#.#
###...###
#########
#.##.##.#
#########

 

이걸 그대로 가져와서 한줄 한줄 나눠서 배열로 저장한 다음

 

각 줄마다 3배씩 하면 사각형에서 위쪽 부분을 일단 얻은거지

 

 

 

 

두번째 줄도 마찬가지로 채워야하는데,

 

두번째 줄 같은 경우는 중간을 비워야하니까 비워야하는 부분은 "."*3**K

 

ROW + "."*3**K + ROW 이런식으로 만들면 되겠지

 

세번째 줄은 첫번째 줄 채운것과 동일하게 각 줄마다 3배씩

 

그리고 각 줄을 하나의 배열에 append 시켜서 만들면 되겠지

 

n = int(input())

if n == 0:
    
    print('#')

elif n == 1:
    
    s = """###
#.#
###"""
    print(s)

elif n == 2:
    
    s = """#########
#.##.##.#
#########
###...###
#.#...#.#
###...###
#########
#.##.##.#
#########"""
    
    print(s)

else:
    
    m = 2

    s = """#########
#.##.##.#
#########
###...###
#.#...#.#
###...###
#########
#.##.##.#
#########"""

    while m < n:

        x = s.split('\n')
        y = s.split('\n')
        z = s.split('\n')

        w = []

        for i in range(len(x)):
            
            w.append(x[i]*3)

        for i in range(len(y)):
            
            w.append(y[i] + '.'*3**m + y[i])

        for i in range(len(z)):
            
            w.append(z[i]*3)

        s = '\n'.join(w)

        m += 1
    
    print(s)

 

TAGS.

Comments