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)
'알고리즘 > 백준' 카테고리의 다른 글
[백준 파이썬] 21608 상어 초등학교 (0) | 2023.07.31 |
---|---|
[백준 파이썬] 17140 이차원 배열과 연산 (0) | 2023.07.29 |
[백준 파이썬] 15683 감시 (0) | 2023.07.27 |
[백준 파이썬] 14891 톱니바퀴 (0) | 2023.07.27 |
[백준 파이썬] 14503 로봇 청소기 (0) | 2023.07.21 |