개발/algorithm
[백준 15685번] 드래곤 커브 - python
zzi_on2
2022. 10. 13. 15:10
문제 링크
https://www.acmicpc.net/problem/15685
15685번: 드래곤 커브
첫째 줄에 드래곤 커브의 개수 N(1 ≤ N ≤ 20)이 주어진다. 둘째 줄부터 N개의 줄에는 드래곤 커브의 정보가 주어진다. 드래곤 커브의 정보는 네 정수 x, y, d, g로 이루어져 있다. x와 y는 드래곤 커
www.acmicpc.net
풀이
규칙을 찾아야하는 문제이다. 나는 규칙을 찾지 못해서 블로그를 참고했다. 다양한 방식으로 접근하려는 노력을 해야겠다.
규칙은 다음과 같다. 예를 들어, 시작 방향이 0이라고 하자
0세대 : 0
1세대 : 0 1
2세대 : 0 1 2 1
3세대 : 0 1 2 1 2 3 2 1
4세대 : 0 1 2 1 2 3 2 1 2 3 0 3 2 3 2 1
...
즉, n세대의 이동 방향은 n-1세대 방향 + n-1세대 방향을 거꾸로 뒤집고 각 방향에 +1을 해준 것이다.
이 때, 4일 경우 다시 0으로 돌아간다.
또한, 여기서 주의할 점은 범위가 0 <= x <= 100 이라는 것이다. 즉, 총 101칸
dx = [1,0,-1,0]
dy = [0,-1,0,1]
n = int(input())
graph = [ [0] * 101 for _ in range(101)]
for _ in range(n):
x, y, d, g = map(int,input().split())
graph[x][y] = 1
move = [d]
# g세대까지 방향 구하기
for _ in range(g):
tmp = []
# 이전 세대 거꾸로 뒤집고 + 1
for j in move[::-1]:
tmp.append((j+1)%4)
# 기존 방향에 덧붙임
move.extend(tmp)
# 드래곤 커브 표시
for i in move:
x += dx[i]
y += dy[i]
graph[x][y] = 1
ans = 0
# 사각형 구하기
for i in range(100):
for j in range(100):
if graph[i][j] == 0 :
continue
if graph[i+1][j] and graph[i][j+1] and graph[i+1][j+1] :
ans += 1
print(ans)