백준 2447번 - 별 찍기 - 10

생각한 풀이

두가지 방법으로 풀 수 있다.
처음 생각한 방법은
1. 별을 9개의 공간으로 나누고, 좌 상부터 1이라고 생각해서 5번을 제외한 나머지 공간의 별을 똑같이 복사한다.
풀다보니 이 방법은 시간이 너무 오래걸린다는 것을 알게되었다. 그래서 일단 다 풀고 나서 다른 풀이를 찾아보고 가장 이해하기 쉬우며 괜찮았다고 생각하는 방법이 이 방법이다.
2. 공간을 열 1, 열 2, 열 3 으로 나누어 재귀함수로 구해진 별을 붙이는 방법이다.
좀더 깊게 설명하자면 제일 먼저 재귀를 통해 n이 1까지 도달하게 하여 "*"을 리턴한다.
그 후 stars는 반복문을 돌아서 1열에는 ["***"]이 되고 2열에는 ["* *"] 3열은 ["***"]이 된다.

코드 1

import sys
sys.setrecursionlimit(10 ** 6)

def star(n):
    if n == 3:
        array[1] = ["*", " ", "*"]
        array[0] = array[2] = ["*"]*3
        return
    star(n//3)
    for i in range(0, n, n//3):
        for j in range(0, n, n//3):
            if i != n//3 or j != n//3:
                for k in range(n//3):
                    array[i+k][j:j + n//3] = array[k][:n//3]
N = int(sys.stdin.readline())
array = [[" "]*N for _ in range(N)]
star(N)

for i in range(N):
    for j in range(N):
        print(array[i][j], end="")
    print()

코드 2

import sys
sys.setrecursionlimit(10 ** 6)
def star(n):
    if n == 1:
        return ["*"]
    stars = star(n//3)
    array = []

    for s in stars:
        array.append(s*3)
    for s in stars:
        array.append(s + ' '*(n//3)+s)
    for s in stars:
        array.append(s*3)
    return array

N = int(sys.stdin.readline().strip())
print('\n'.join(star(N)))

결과

0개의 댓글

Powered by GraphCDN, the GraphQL CDN