n = int(input())
# 하나의 삼각형을 3*6 짜리 직사각형으로 생각한다.
# 전체 캔버스는 맨 밑줄에 맞춰서 그려준다
canvas = [[' '] * (n//3 * 6) for i in range(n)]
# 삼각형 하나를 그려주기 위한 재귀호출
def fill(k, x, y) :
# 만약 가장 작은 삼각형이라면 그려주고 끝낸다
if k == 3 :
draw(x,y)
return
tk = k // 2 # 현재 삼각형의 크기
fill(tk, x + tk, y) # 위쪽 중간 부분에 그릴 삼각형
fill(tk, x, y + tk) # 아래쪽 왼쪽 부분에 그릴 삼각형
fill(tk, x + (6 * tk // 3),y + tk) # 아래쪽 오른쪽에 그릴 삼각형
# 호출된 지점에서 3*6 짜리 직사각형 안에 삼각형 하나를 그려준다
# 호출된 지점은 재귀호출되며 좌표변환이 일어나 캔버스의 절대좌표값이 들어간다
def draw(x,y) :
canvas[y][x+2] = '*'
canvas[y+1][x+1] = '*'
canvas[y+1][x+3] = '*'
canvas[y+2][x] = '*'
canvas[y+2][x+1] = '*'
canvas[y+2][x+2] = '*'
canvas[y+2][x+3] = '*'
canvas[y+2][x+4] = '*'
fill(n, 0, 0)
for lines in canvas :
print(''.join(lines))
[Try]
1. 삼각형을 그린다기보단 직사각형(내에 존재하는 삼각형)을 그린다고 생각하고 풀었다
2. 생각보다 쉽게 해결했다...놀라워
[Point]
1. 사실 이거 다른분들 풀이 봐야하는데... 재귀는 다들 자신만의 방식으로 풀어서 하나하나 이해하기가 너무 힘들다
[More]
1. 언젠간 보도록 하자 ㅋㅋㅋㅋㅋㅋ
'PS > BOJ' 카테고리의 다른 글
[백준] 2961.py : 도영이가 만든 맛있는 음식 (0) | 2020.05.17 |
---|---|
[백준] 1654.cpp : 랜선 자르기 (0) | 2020.05.16 |
[백준] 10989.cpp : 수 정렬하기 3 (0) | 2020.05.15 |
[백준] 2108.cpp : 통계학 (0) | 2020.05.15 |
[백준] 11651.cpp : 좌표 정렬하기 2 (0) | 2020.05.14 |