본문 바로가기

알고리즘 문제풀이/백준

백준(boj) 2447 별 찍기 - 10(파이썬)

https://www.acmicpc.net/problem/2447

***
* *
***

문제의 기본 패턴입니다.

img

주어진 예제를 보시면 기본모양의 패턴들이 점점 확장하는 모양인 것을 볼 수 있습니다.

이를 이용해 문제를 해결해 봅시다.

함수를 만들껀데, 저런 모양들을 그리기 위해서 시작 좌표인 x, y 값과, 그릴 그림의 길이인 n을 가지고 만들어 보겠습니다.

def draw(x, y, n)           #시작좌표 (x,y), 그림 그릴 길이 n

base case는 n==1일 때 시작좌표에 별을 그리고 마칩니다. (x, y시작으로 (n=1)길이 만큼 그림)

마지막에 모양을 출력하기 위해서 저는 문자열을 넣을 수 있는 배열을 사용했습니다.

def draw(x, y, n):
   if n==1:                 #base case
       dohwaji[x][y]='*'
       return

그리고 길이가 1인 *을 이용해서 기본 패턴을 만들려면 다음과 같은 좌표 8개가 필요합니다.

img

그리고 다시 예제 그림을 보면,

img

가장 큰 네모에서 기본 패턴까지의 네모 길이를 살펴보면 27 => 9 => 3으로 그림을 그릴 부분 부분의 길이가 3으로 나눈 값들임을 알 수 있습니다.


이 두가지 정보를 종합해보면,

(0, 0)을 시작점으로, 길이가 n인 그림을 그리는데,

더 작은 부분을 그릴때는 n을 3으로 나눈 값으로 하고, 시작 좌표는 기본패턴 모양인 8가지의 좌표를 가지고 그린다.


입니다. 이를 코드로 살펴보면 다음과 같습니다.


python3 코드

from sys import*
setrecursionlimit(10**6)
def draw(x, y, n):
   if n == 1:
       dohwaji[x][y]='*'
       return
   div = int(n/3)             #더 작은 부분 그릴 때 n을 3으로 나눈 값
   #기본패턴의 8가지 좌표를 시작으로 더 작은 부분을 그림
   draw(x, y, div)
   draw(x, y+div, div)
   draw(x, y+div+div, div)
   draw(x+div, y, div)
   draw(x+div, y+div+div, div)
   draw(x+div+div, y, div)
   draw(x+div+div, y+div, div)
   draw(x+div+div, y+div+div, div)
n=int(input())
dohwaji = [[' 'for i in range(n)] for _ in range(n)]
draw(0, 0, n)                 #(0,0)을 시작좌표로, n만큼의 길이의 모양 그림
for i in range(n):           

   print(''.join(dohwaji[i]))

위에서 8가지 좌표 부분을 다음과 같이 반복문을 사용해서 그려줄 수도 있습니다.

for i in range(3):
    for j in range(3):
       if i==1 and j==1: continue  #(x+1, y+1)은 그리지 않고 건너 뜀
       draw(x+div*i, y+div*j, div)