yha97 2023. 5. 8. 15:52

날짜 : 2023. 05. 08

사용 언어 : python

 

문제

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

 

 

코드

import sys
sys.setrecursionlimit(10**3)
n = int(sys.stdin.readline())
graph = [[True] * n for _ in range(n)]


def star(r, c, a, flag):
    if a == 0:
        return
    #print(r, c, a)
    if flag:  # True -> 재귀적으로 돌림
        for i in range(3):
            for j in range(3):
                if i == j == 1:
                    star(r + i * (a // 3), c + j * (a // 3), a // 3, False)
                else:
                    star(r + i * (a // 3), c + j * (a // 3), a // 3, True)
    else:  # False -> 길이에 대해서 전부 False처리
        for i in range(r, r + a):
            for j in range(c, c + a):
                graph[i][j] = False
    return


star(0, 0, n, True)
for i in range(n):
    for j in range(n):
        if graph[i][j]:
            print("*", end="")
        else:
            print(" ", end="")
    print()

 

풀이

- 재귀를 활용하여 풀이한다.

- 기준 인덱스의 행, 열을 각각 r, c라고 가정할 때, 탐색 길이(a)를 기준으로 돌린다.

- 3의 제곱승으로 입력받았기 때문에, 3으로 나누어가면서 재귀를 돌리되, 정가운데의 경우에는 전부 공백으로 출력해야 하기 때문에 플래그를 False로 적용시켜 재귀한다.

- 플래그가 False인 경우에는 공백처리해야 하기 때문에 해당 범위를 전부 False로 처리한다.

 

 

알게된 점

- 재귀방식으로 출력하려고 했지만 개행의 측면에서 어떻게 해야 할 지 풀이방식이 떠오르지 않았다.

- 그래서 따로 리스트를 만들어 True/False처리로 풀이하는 것을 떠올렸고, 재귀를 통해 리스트 최신화 후, 이중 for문으로 True/False값에 따라 별찍기를 하도록 만들었다.

- 다만 파이썬 언어 특성상 메모리를 많이 잡아먹었기 때문에 재귀 제한을 설정하는 것이 중요했다.

 

 

참고 사이트