https://www.acmicpc.net/problem/2447
***
* *
***
문제의 기본 패턴입니다.
주어진 예제를 보시면 기본모양의 패턴들이 점점 확장하는 모양인 것을 볼 수 있습니다.
이를 이용해 문제를 해결해 봅시다.
함수를 만들껀데, 저런 모양들을 그리기 위해서 시작 좌표인 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개가 필요합니다.
그리고 다시 예제 그림을 보면,
가장 큰 네모에서 기본 패턴까지의 네모 길이를 살펴보면 27 => 9 => 3으로 그림을 그릴 부분 부분의 길이가 3으로 나눈 값들임을 알 수 있습니다.
이 두가지 정보를 종합해보면,
(0, 0)을 시작점으로, 길이가 n인 그림을 그리는데,
더 작은 부분을 그릴때는 n을 3으로 나눈 값으로 하고, 시작 좌표는 기본패턴 모양인 8가지의 좌표를 가지고 그린다.
입니다. 이를 코드로 살펴보면 다음과 같습니다.
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)
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
백준(boj) 11729 하노이 탑 이동 순서(파이썬) (0) | 2020.07.29 |
---|---|
백준(boj) 10870_피보나치 수5 (파이썬) (0) | 2020.07.29 |
백준(boj) 17140_이차원 배열과 연산 (파이썬, c++) (0) | 2020.04.24 |
백준(boj) 17142 연구소3 (파이썬, c++) (0) | 2020.04.23 |
백준(boj) 17144_미세먼지 안녕! (파이썬, c++) (0) | 2020.04.23 |