시작하는 중
[파이썬] 백준 2447번 - 별 찍기 본문
문제
재귀적인 패턴으로 별을 찍어 보자. 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)
T = 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 재귀문
제가 노트에 적을 때는 되게 쉬웠는데 글로 적을라니 아쉽네요 ㅠㅠ