본문 바로가기

알고리즘/백준 (Pyhthon)

[알고리즘] 백준 15685 드래곤 커브 / 파이썬

www.acmicpc.net/problem/15685

 

15685번: 드래곤 커브

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

www.acmicpc.net

 

from copy import deepcopy

#방향에 따른 좌표값 계산하는 함수
def loc(xx, yy, dir):
    if dir == 0: return xx, yy+1
    elif dir == 1: return xx-1, yy
    elif dir == 2: return xx, yy-1
    elif dir == 3: return xx+1, yy

#중복을 없애는 set에 뱡향값들을 좌표로 바꿔 넣는 함수
def dir_cal(lst, x, y):
    for i in lst:
        x, y = loc(x, y, i)
        loc_set.add((x, y))

#방향값의 규칙대로 리스트에 집어넣는 함수
def sol(x, y, d, g):
    temp_num, num_lst = 0, [d]
    for _ in range(g):
        temp_lst = deepcopy(num_lst)
        while temp_lst:
            temp_num = temp_lst.pop()
            num_lst.append((temp_num+1)%4)
    dir_cal(num_lst, x, y)

N = int(input())
loc_set = set()
for _ in range(N):
    y, x, d, g = map(int, input().split(' '))
    loc_set.add((x, y))
    sol(x, y, d, g)
dx, dy = [1, 0, 1], [0, 1, 1]
result = 0
#오른쪽, 아래, 대각선 좌표를 검사하고 set집합에 셋다 있으면 +1해준다
for lx, ly in loc_set:
    for i in range(3):
        if (lx+dx[i], ly+dy[i]) not in loc_set:
            break
    else:
        result += 1
print(result)