sm 기술 블로그

73. 2447 (별 찍기 - 10) 본문

문제/백준_파이썬

73. 2447 (별 찍기 - 10)

sm_hope 2022. 6. 6. 23:10

좀 어려웠다..

처음에

n = int(input())

result = ""

# 1. 함수정의


def star(x, y, n):
    global result
    if(x // n) % 3 == 1 and (y // n) % 3 == 1:
        # x, y를 현재 n값에 나누고 그 값의 3의 나머지가 1일 때
        result += " "
    elif n == 1:
        # 위 조건에 만족하지 않고 n이 1/3 까지 오면 별 출력
        result += "*"
    else:
        star(x, y, n//3)
        # n을 3으로 나누고, 함수 재호출


# 2. 계산 시작
for x in range(n):
    for y in range(n):
        star(x, y, n)
    result += "\n"

print(result)

을 이용하였다.

행,열이 3의 나머지가 1이면 비어있다는 성질을 이용하여 풀었으나, 출력은 정상적으로 나오지만 시간초과가 발생한다. (반복문이 많아서...)

 

그래서 반복문은 적게 쓰고 한번에 그리는 방법을 생각해 보았다.

n = int(input())


def draw_star(n):
    # n이 1일때 = n이 더이상 3으로 나눠질 수 없을 때
    if n == 1:
        return ["*"]
    # n이 1이 될때 까지 실행
    stars = draw_star(n//3)
    result = []
    # 3n + 1번째 줄
    for first in stars:
        result.append(first*3)
    # 3n + 2번째 줄
    for second in stars:
        result.append(second + " "*(n//3) + second)
    # 3n + 3번째 줄
    for third in stars:
        result.append(third*3)
    return result


print("\n".join(draw_star(n)))

stars 3에서 3 x 3의 그림을 하나 그리게 된다.

그 그림은 result 9의 stars에 저장되고 first, second, third를 진행하면서  

 

result 9에서 리스트 [0, 1, 2]번은 *3을 한 것(first) 이고, [3, 4, 5]번은 stars + 공백 + stars(second) 를,

[6,7,8]번은 *3을 했다(third).

 

result를 재귀함수 안에서 초기화 해주어 처음에 들어갔던 값은 무시된다.

second + " "*(n//3) + second 수식에 대해 설명하면, second에 stars:9와 매치를 시키면 된다 

(1)

처음에는 ***가 second에 들어간다.

second + " "*(n//3) + second => *** + " "*(n//3) + ***이 된다. n은 9 이기 때문에 3이나온다.

즉, 공백이 3칸이라는 것이다.

second의 첫 리스트 ***   ***이 만들어 졌다.

(2)

두번째는 * *이 seconde에 들어간다.

second + " "*(n//3) + second => * *+ " "*(n//3)+* * 이 된다. 마찬가지로 n은 9이기 때문에 공백이 3칸 들어간다.

second의 두번째 리스트 * *   * *이 만들어 졌다.

(3)

세번째는 ***이 second에 들어간다.

(1)과 동일하므로 생략한다.

 

'문제 > 백준_파이썬' 카테고리의 다른 글

75. 2798(블랙잭)  (0) 2022.06.08
74. 11729(하노이 탑 이동 순서)  (0) 2022.06.08
72. 17478 (재귀함수가 뭔가요?)  (0) 2022.06.06
71. 10870(피보나치수열)  (0) 2022.06.06
70. 10872 (팩토리얼)  (0) 2022.06.06
Comments