[BOJ][Python][실1][2447] 별 찍기 - 10

문제 링크

문제링크

첫 번째 풀이

가운데 부분을 제외하고 8방향으로 ‘*‘를 채우는 과정을 재귀적으로 진행합니다.

정답코드

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
32
33
34
35
36
37
38
39
import sys
from math import pi, sqrt
from collections import deque

# 배열 초기화
# MAX = 15
# arr = [[0] * MAX for _ in range(MAX)]
# arr = [0] * MAX

# TestCase
# for _ in range(int(input())):

# 배열 접근
# for r in range(MAX):
#     for c in range(MAX):

# 파일 입력
# sys.stdin = open('input.txt', 'r')
n = int(sys.stdin.readline())
MAX = n
arr = [[' ' for _ in range(MAX)] for _ in range(MAX)]


def recur(N, x, y):
    global arr
    if N == 1:
        arr[x][y] = '*'
    else:
        for i in range(3):
            for j in range(3):
                if i != 1 or j != 1:
                    recur(N // 3, x + (N // 3) * i, y + (N // 3) * j)


recur(n, 0, 0)

str = ''
for s in arr:
    print(*s, sep='')

두 번째 풀이

전체를 ‘*‘로 만들고 가운데만 ‘ ‘로 만드는 연산을 진행한 뒤, 8방향에 대해서 같은 과정을 진행합니다.

이 때 n이 0일 때까지 진행하면 시간초과, 1까지 진행하면 정답입니다.

정답코드

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
import sys
from math import pi, sqrt
from collections import deque

# 파일 입력
# sys.stdin = open('input.txt', 'r')
n = int(sys.stdin.readline())
MAX = n
arr = [['*' for _ in range(MAX)] for _ in range(MAX)]


def recur(arr, x, y, n):
    if n == 1:
        return
    # 왼쪽 위 좌표가 (x,y)이고 길이가 n인 경우
    n //= 3
    for i in range(3):
        for j in range(3):
            if i == 1 and j == 1:
                for r in range(n, n * 2):
                    for c in range(n, n * 2):
                        arr[x+r][y+c] = ' '
            else:
                recur(arr, x + n * i, y + n * j, n)


recur(arr, 0, 0, n)

for s in arr:
    print(*s, sep='')

Success Notice: 수고하셨습니다. :+1:

Leave a comment