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)
'경쟁 프로그래밍 > Atcoder' 카테고리의 다른 글
ABC 350 D번 복기 - 직접 연결되어있지는 않지만 도달할 수 있는 경로의 개수 구하는법 (0) | 2024.04.21 |
---|---|
ABC 348 D번 복기 - 그래프를 재구성하고 BFS/DFS를 해야하는 문제 (0) | 2024.04.10 |
ABC 340 F번 복기 - 확장 유클리드 알고리즘 제대로 활용하기 (0) | 2024.02.21 |
ABC 339 D번 복기 - 4차원 visited 배열 BFS 백트래킹 (0) | 2024.02.05 |
ABC 336 C번 복기 - 0,2,4,6,8로만 만든 숫자들 중 n번째 숫자를 찾는 놀라운 방법 (0) | 2024.01.21 |