본문 바로가기

algorithm/백준알고리즘

[백준알고리즘] 2447번: 별 찍기 10 -Python

728x90

[백준알고리즘] 2447번: 별 찍기 10 -Python

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

 

2447번: 별 찍기 - 10

첫째 줄에 N이 주어진다. N은 항상 3의 제곱꼴인 수이다. (3, 9, 27, ...) (N=3k, 1 ≤ k < 8)

www.acmicpc.net

모든 공간을 *로 채워준 다음에 지워야 할 부분들을 지워주었다. 각 상태에서 9개의 구역을 나눠 가운데에 위치한 구역은 모두 빈칸 ' '을 만들어주어야 한다. 그리고 나눠진 작은 구역들도 반복해서 수행해준다.

 

아래에 새롭게 푼 코드를 추가했는데 재귀를 사용해서 더 깔끔하게 풀었다.

def rm(i, j, size):
    if size == 1: return

    new_size = size//3
    for ri in range(3):
        for rj in range(3):
            if ri == 1 and rj == 1:
                for ti in range(i + ri*new_size, i + (ri+1)*new_size):
                    for tj in range(j + rj*new_size, j + (rj+1)*new_size):
                        table[ti][tj] = ' '
                continue
            rm(i + ri*new_size, j + rj*new_size, new_size)

n = int(input())
table = [['*']*n for _ in range(n)]
rm(0, 0, n)
for t in table:
    print(''.join(t))

 

def blank(t, x, y):
    if t == 1: return
    
    sx, ex= x + t//3, x + (t//3)*2
    sy, ey= y + t//3, y + (t//3)*2
    for i in range(sx, ex):
        for j in range(sy, ey):
            table[i][j] = ' '
        
    blank(t//3, x, y)
    blank(t//3, sx, y)
    blank(t//3, ex, y)
    blank(t//3, x, sy)
    blank(t//3, ex, sy)
    blank(t//3, x, ey)
    blank(t//3, sx, ey)
    blank(t//3, ex, ey)
"""
***
* *
***
"""
n = int(input())
table = [['*'] * n for _ in range(n)]
blank(n, 0, 0)
for t in table:
    print(''.join(t))

 

잘못된 점이나 부족한 점 지적해주시면 감사하겠습니다

728x90