보물창고 블로그

백준 알고리즘 15685번 드래곤 커브 풀이 with Python 본문

알고리즘 풀이/백준 알고리즘

백준 알고리즘 15685번 드래곤 커브 풀이 with Python

홋 메 2020. 2. 21. 16:39
728x90

문제 링크: https://www.acmicpc.net/problem/15685

 

15685번: 드래곤 커브

첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커브의 시작 점, d는 시작 방향, g는 세대이다. (0 ≤ x, y ≤ 100, 0 ≤ d ≤ 3, 0 ≤ g ≤ 10) 입력으로 주어지는 드래곤 커브는 격자 밖으로 벗어나지 않는다. 드래곤 커브는 서로 겹칠 수 있다. 방향은 0, 1, 2,

www.acmicpc.net

문제는 아래와 같습니다.

백준 15685번 드래곤 커브

이 문제의 핵심은 드래곤 커브를 받았을 때 그 드래곤 커브를 알맞게 구현하는 것과 드래건 커브의 포인트들 중에서 사각형을 찾는 것이 핵심입니다. 아래는 제가 해결한 코드입니다. 

# x,y와 방향 d, 세대 g 그리고 드래곤 커브의 좌표값을 저장할 딕셔너리 dict1
def dragon(x, y, d, g, dict1):
    dx = [1, 0, -1, 0]
    dy = [0, -1, 0, 1]
    dict1[(x, y)] = 1
    list1 = [d]
    x += dx[d]
    y += dy[d]
    dict1[(x, y)] = 1
    for _ in range(g):
        sub = []
        for i in range(len(list1)-1, -1, -1):
            x += dx[(list1[i] + 1) % 4]
            y += dy[(list1[i] + 1) % 4]
            dict1[(x, y)] = 1
            sub.append((list1[i] + 1) % 4)
        list1 += sub


n = int(input())
answer = 0
dic1 = {}
# n개의 드래곤 커브를 dict1에 좌표값에 저장한다.
for _ in range(n):
    x, y, d, g = map(int, input().split())
    dragon(x, y, d, g, dic1)
# 좌표값들 중에 나는 왼쪽 상단을 기준으로 3개의 점이 있으면 사각형이 된다고 하였다.
for i in list(dic1.keys()):
    count = 0
    nx = i[0]
    ny = i[1]
    if dic1.get((i[0] + 1, i[1])) == 1:
        count += 1
    if dic1.get((i[0], i[1] + 1)) == 1:
        count += 1
    if dic1.get((i[0] + 1, i[1] + 1)) == 1:
        count += 1
    if count == 3:
        answer += 1
print(answer)

 

Comments