시작하는 중

[파이썬] 백준 2447번 - 별 찍기 본문

카테고리 없음

[파이썬] 백준 2447번 - 별 찍기

싱욱 2022. 5. 1. 21:01

문제

재귀적인 패턴으로 별을 찍어 보자. 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=3k이며, 이때 1 ≤ k < 8이다.

출력

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

예제 입력 1 복사

27

 

예제 출력 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
def star(star_list,count,goal):
    move_index = (count - 1// 2
    count *= 3
    tmp = goal // count
    middle = (goal - 1// 2
    for x_i in range(-(tmp-1)//2,(tmp-1)//2+1):
        for y_i in range(-(tmp-1)//2,(tmp-1)//2+1):
            middle_x = middle + count*x_i
            middle_y = middle + count*y_i
            for x in range(-move_index,move_index+1):
                for y in range(-move_index,move_index+1):
                    star_list[middle_x+x][middle_y+y] = " "
 
 
    if count == goal:
        for x in star_list:
            for y in x:
                print(y,end="")
        return
    else:
        star(star_list,count,goal)
 
= int(input())
star_dot = []
for i in range(T):
    tmp_list = list("*" for j in range(T-1))
    tmp_list.append("*\n")
    star_dot.append(tmp_list)
star(star_dot,1,T)

cs

 

#23 T가 입력되면 크기가 T x T인 정사각형을 만들 수 있음

#24 star_dot 리스트를 만들고 이를 2차원 다루기 위해 2차원 배열로 만들거임

#26 가로는 T-1만큼 *로 입력되고 마지막 *은 줄바꿈을 위해 *\n을 마지막에 append

#29 함수 실행

 

#1 매개변수 star_list는 #24의 별로 이루어진 list, count는 탈출 조건, goal은 탈출할 count 목표

#2~5

move_index는 점에서 얼마만큼 지워갈지를 선택

count는 탈출 조건 중 하나이지만 그와 동시에 얼마만큼 이동할 것인지를 나타냄

tmp는 count에 따른 이동 횟수를 나타냄

middle은 TxT 정사각형의 중앙을 나타냄

 

#6~7 27의 길이에서 count=3 -> 3칸씩 이동할 경우 중심인 13에서 좌우로 4번씩 이동 가능하므로

tmp=9 -> (9-1) // 2 = 4, -4~5까지 for문으로 설정

#8~9 여기에 중심점인 middle + x * count를 해주면 -12~12까지 이동

#10~11 count가 9일때 tmp는 3이라서 각 x,y는 4,13,21의 값을 지닐 수 있다.

이때 각 위치에서 상하좌우로 1칸씩 *을 지워나가야 한다.(위의 그림에서 4,13의 부분)

move_index를 이를 나타낸다. 이미 -1 / 2를 해줬기에 또할필요는없슴

#12 해당 좌표를 스페이스바로 대체

 

#15 탈출 조건문

#20 재귀문

 

 

제가 노트에 적을 때는 되게 쉬웠는데 글로 적을라니 아쉽네요 ㅠㅠ