15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커

www.acmicpc.net

어떻게 해야 추가되는 좌표가 순서대로 되는지 확인하면서 작성해야된다.

N = int(input())
curves = [list(map(int, input().split())) for _ in range(N)]

direction = [[1, 0], [0, -1], [-1, 0], [0, 1]]

def rotation(x, y, x_o, y_o):
    rotate_m90 = [[0, -1], # 반시계 방향 90도 회전
                 [1, 0]]
    x_ = x - x_o # 원점 이동
    y_ = y - y_o
    x_t = x_*rotate_m90[0][0] + y_*rotate_m90[0][1] # 회전
    y_t = x_*rotate_m90[1][0] + y_*rotate_m90[1][1]
    x_r = x_t + x_o # 원점 복원
    y_r = y_t + y_o
    return x_r, y_r

def dragon_curve(x, y, d, g):
    c = [[x, y], [x+direction[d][0], y+direction[d][1]]] # 0 세대
    curr = 0
    while curr < g:
        c_ = []
        x_o, y_o = c[-1] # 끝점이 회전의 기준점이 된다
        for x, y in c[:-1][::-1]: # 가까운 점부터 회전시켜야 멀리있는 점이 끝점이 된다
            x_r, y_r = rotation(x, y, x_o, y_o) # 좌표 회전 후
            c_.append([x_r, y_r]) # 리스트에 추가
        c.extend(c_) # 전체 좌표들에 추가
        curr += 1 # 세대 추가
    return c


board = [[False for _ in range(101)] for _ in range(101)]
for x, y, d, g in curves:
    coord = set(map(tuple, dragon_curve(x, y, d, g)))
    for x, y in coord:
        board[y][x] = True # 평면에 좌표 추가

count = 0
for y in range(100):
    for x in range(100):
        if (board[y][x] and board[y][x+1]
            and board[y+1][x] and board[y+1][x+1]):
            count += 1 # 네 점이 모두 참이라면 카운트
            
print(count)

+ Recent posts