from palette import colorful_colors

[백준] 15685 드래곤 커브 with 파이썬 본문

알고리즘/알고리즘 with 파이썬

[백준] 15685 드래곤 커브 with 파이썬

colorful-palette 2023. 11. 6. 21:14

 

점기준 회전으로 풀었다

모든 점들은 체커라는 리스트에 표시해서 나중에 정사각형 계산할때 더 빠르게 계산할 수 있도록 했다

import sys
input = sys.stdin.readline
N = int(input())
start_curbs = [list(map(int, input().split())) for _ in range(N)]   # 시작점, 시작방향, 세대
checker = [[0 for _ in range(101)] for _ in range(101)]
curbs = []
dx = [1, 0, -1, 0]      # 우상좌아
dy = [0, -1, 0, 1]

# a, b를 기준으로 x, y가 90도 회전
def rotate(a, b, x, y):
    x_tmp, y_tmp = x - a, y - b
    rotate_x, rotate_y = -y_tmp, x_tmp
    rotate_x, rotate_y = a + rotate_x, b + rotate_y
    return rotate_x, rotate_y

# def checker

for start_curb in start_curbs:
    current_curbs = []
    current_curbs.append((start_curb[0], start_curb[1]))
    direction = start_curb[2]
    start_point = (start_curb[0], start_curb[1])
    for i in range(start_curb[3] + 1):                  # 세대마다
        if i == 0:                        # 0세대인경우
            current_curbs.append((start_curb[0] + dx[direction], start_curb[1] + dy[direction]))
            end_point = (start_curb[0] + dx[direction], start_curb[1] + dy[direction])               # 맨 처음 끝점
        else:
            new_curbs = []
            for curb in current_curbs:
                rotate_x, rotate_y = rotate(end_point[0], end_point[1], curb[0], curb[1])
                new_curbs.append((rotate_x, rotate_y))

            # curb 채우기
            for new_curb in new_curbs:
                if new_curb not in current_curbs:
                    current_curbs.append(new_curb)

            # 끝점 찾기
            end_point_x , end_point_y = rotate(end_point[0], end_point[1], start_point[0], start_point[1])
            end_point = (end_point_x, end_point_y)

    # 체커에 표시하기
    for point in current_curbs:
        checker[point[0]][point[1]] = 1

# print(curbs)      # (0,0부터 99,99까지)
count = 0
for i in range(100):
    for j in range(100):
        if checker[i][j] * checker[i+1][j] * checker[i][j+1] * checker[i+1][j+1]:
            count += 1

print(count)