상세 컨텐츠

본문 제목

드래곤 커브

코딩테스트/구현

by 수타. 2023. 7. 26. 21:23

본문

https://www.acmicpc.net/problem/15685

 

15685번: 드래곤 커브

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

www.acmicpc.net

문제요약:

좌표와 방향, 드래곤커브의 세대가 n개 주어진다. 드래곤 커브란 0세대는 그냥 한칸 방향따라 전진한 것이고 n세대 부터는 그전까지 간 좌표들을 마지막 좌표 기준으로 90도 회전시킨 좌표들을 뜻한다. 모든 좌표를 이동후, 크기가 1인 정사각형의 네 꼭짓점이 모두 드래곤 커브의 일부인 것의 개수를 구하시오.

 

소요시간:

50분

난이도 골드4

 

코딩:

import sys 
input = sys.stdin.readline

n = int(input())

dragon = []
arr = [[0]*101 for _ in range(101)]

for _ in range(n):
    dragon.append(list(map(int,input().split())))

dx = [1,0,-1,0]
dy = [0,-1,0,1]

for x,y,dir,gen in dragon:
    arr[y][x] = 1
    arr[y+dy[dir]][x+dx[dir]] = 1
    temp1 = [[y,x],[y+dy[dir],x+dx[dir]]]
    for _ in range(gen):
        temp2 =temp1[::-1]
        l_y,l_x = temp2[0]
        for y,x in temp2:
            y-=l_y
            x-=l_x
            #90도 회전
            x,y = -y,x
            x+=l_x
            y+=l_y
            if 0<=y<101 and 0<=x<101:
                temp1.append([y,x])
                arr[y][x] = 1
ans = 0
for i in range(100):
    for j in range(100):
        if arr[i][j] and arr[i][j+1] and arr[i+1][j] and arr[i+1][j+1]:
            ans +=1

print(ans)

구현 문제입니다. 문제의 포인트는 회전 이동이였는데, 특정 점을 다른점을 기준으로 90도를 회전시키는 것이었습니다. 

이때 저는 특정지점과 기준점을 기준점이 (0,0)이 되게 대칭이동을 하고, (0,0)을 기준으로 시계방향으로 90도 회전시키면 (x,y)점이 (-y,x)이 되고 다시 대칭이동시켜주어 돌려주었습니다.

또한 이전세대의 점들의 집합중에서(temp1) 가장 첫번째 점이 이동후 그다음 세대의 기준점이 되게 때문에 중간에 temp2의 순서를 반전시켰고, temp2를 따로 만든 이유는 하나의 temp에 갱신을 하게되면 for문에서 갱신하면서 다시 추가하기 때문에 세대간을 구분하기 위함이었습니다.

'코딩테스트 > 구현' 카테고리의 다른 글

미세먼지 안녕!  (0) 2023.07.28
치킨 배달  (0) 2023.07.26
기둥과 보 설치  (0) 2023.07.19
퍼즐 조각 채우기  (0) 2023.06.30
프렌즈4블록  (0) 2023.06.28

관련글 더보기