[백준 삼성기출 △] 드래곤 커브(python)

이진규·2022년 8월 8일
1

백준(PYTHON)

목록 보기
68/115

문제

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

나의 코드

"""

"""

from sys import stdin
input = stdin.readline

n = int(input())
pan = [ [0] * (100+1) for _ in range(100+1) ] # 크기가 100×100인 격자 위에 드래곤 커브가 N개 있다.
answer = 0

def search_square(): # 네 꼭짓점이 드래콘 커브의 일부인것의 개수를 세는 함수
    global answer

    for i in range(100): # +1씩 해서 4방향으로 탐색하기 때문에 생성한 100+1*100+1이 아닌 100*100으로 탐색한다.
        for j in range(100):
            if pan[i][j] == 1 and pan[i+1][j] == 1 and pan[i][j+1] == 1 and pan[i+1][j+1] == 1:
                answer += 1

dx, dy = [0, -1, 0, 1], [1, 0, -1, 0] # 동, 북, 서, 남
for _ in range(n):
	
    # x, y를 바꿔서 입력받은 이유는 문제 자체에서 x, y을 바꿔서 줬기 때문임.
    y, x, d, g = map(int, input().split()) # x와 y는 드래곤 커브의 시작 점, d는 시작 방향, g는 세대
    pan[x][y] = 1

    curve = [d]
    for i in range(g):
        for k in range(len(curve)-1, -1, -1): # 가장 최근 회전한것 부터 회전방향을 바꿔준다.
            curve.append((curve[k] + 1) % 4) # 0:동, 1:북, 2:서, 3:남

    for k in range(len(curve)): # 회전 방향을 기록해놓은 대로 전진하면서 좌표를 업데이트 해준다.
        x += dx[curve[k]]
        y += dy[curve[k]]
        pan[x][y] = 1

search_square()
print(answer)
    

설명

0세대, 1세대, 2세대 세대가 올라갈수록 회전 방향이 바뀌게 된다.

이 회전방향의 규칙을 찾아야 하는데 처음이 만약 d=0, 즉 동쪽으로 간다고 한다면 그 다음은 시계방향으로 90도 회전한 북쪽방향, 그 다음은 서쪽방향을 거쳐 북쪽방향으로 가게 된다.

회전방향을 리스트로 나타내면
0세대 드래곤 커브 = [0]
1세대 드래곤 커브 = [0, 1]
2세대 드래곤 커브 = [0, 1, 2, 1] 이된다. (동쪽:0, 북쪽:1, 서쪽:2, 남쪽:3)

2세대 드래곤 커브에서 인덱스2의 2는 인덱스1에 +1한 값이고(북쪽에서 서쪽으로 변경), 인덱스3의 1은 인덱스0에 +1한 값이다(서쪽에서 북쪽으로 변경). 즉 최근에 회전된 것부터 +1을 하면서 회전방향을 바꿔준 것이다.

참고 자료

https://tmdrl5779.tistory.com/146

profile
항상 궁금해하고 공부하고 기록하자.

0개의 댓글