www.acmicpc.net/problem/2448

 

2448번: 별 찍기 - 11

첫째 줄에 N이 주어진다. N은 항상 3×2k 수이다. (3, 6, 12, 24, 48, ...) (k ≤ 10)

www.acmicpc.net

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. 언젠간 보도록 하자 ㅋㅋㅋㅋㅋㅋ

+ Recent posts