티스토리 뷰

728x90
반응형

문제

 

재귀적인 패턴으로 별을 찍어 보자. 

N이 3의 거듭제곱(3, 9, 27,...)이라고 할 때, 크기 N의 패턴은 N×N 정사각형 모양이다.

크기 3의 패턴은 가운데에 공백이 있고, 가운데를 제외한 모든 칸에 별이 하나씩 있는 패턴이다.

***
* *
***

N이 3보다 클 경우, 크기 N의 패턴은 공백으로 채워진 가운데의 (N/3) ×(N/3) 정사각형을 크기 N/3의 패턴으로 둘러싼 형태이다. 

예를 들어 크기 27의 패턴은 예제 출력 1과 같다.

 

입력

 

첫째 줄에 N이 주어진다. N은 3의 거듭제곱이다. 즉 어떤 정수 k에 대해 $N=3^{k}$이며, 이때 1 ≤ k < 8이다.

 

출력

 

첫째 줄부터 N번째 줄까지 별을 출력한다.

 

풀이

 

오랜 시간이 걸려서 풀었지만 풀어놓고도 잘 이해가 가지 않는 문제이다.

 

다른 재귀함수 문제들은 예상보다 간단한 것들 뿐이라서 잘 넘어갔는데..

 

솔직히 문제를 처음 봤을 땐 어떻게 재귀를 이용하라는 건지도 감이 오지 않았으니까.

 

해결책은 주어진 숫자의 크기만큼 2차원 배열을 만들어 빈칸으로 채운 뒤,

 

별을 찍을 곳의 인덱스만 별로 바꾸어주는 간단한 로직이다.

 

근데 디버그를 하면서 따라가지 않고 눈으로는 도저히 시뮬레이션이 안 되는 걸 보면

 

내 한계가 여기까지인가 보다..

 

하지만 적어도 외우기라도 하기 위해 일단 블로그에 올린다.

import sys

n = int(sys.stdin.readline().rstrip())

result = [[' '] * n for _ in range(n)]


def star(n, x, y):
    if n == 1:
        result[y][x] = '*'
        return

    m = n // 3
    for dy in range(3):
        for dx in range(3):
            if dx == 1 and dy == 1:
                continue
            star(m, x + m * dx, y + m * dy)


star(n, 0, 0)

for i in result:
    print(''.join(i))

마지막 print에 ''.join(i)을 쓴 이유는 이 외에 더 좋은 출력방법을 떠올리지 못했기 때문이다.

 

덕분에 조금 코드가 미워지긴 했지만, 재귀 로직 자체는 간결하게 완성한 것 같아 올려봄!

반응형
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   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
글 보관함