문제 링크
시계방향 순서로 꼭짓점들의 좌표가 주어지는 조형물에, 45도 각도로 빛이 입사했을 때 생기는 그림자의 길이의 합을 출력하는 문제이다.
기본적인 원리는 그림자를 적절히 변형해서 구하기 쉬운 형태로 만드는 것이다.
빨간색, 노란색, 초록색 선분들을 잘 옮겨 보면 결과적으로 축에 정사영한 것과 똑같은 결과가 되어 보라색 선분 길이의 2배가 그림자 길이의 총합이 된다. 정사각형을 잘 쪼개서 계단 모양으로 만들어도 그 둘레 길이는 바뀌지 않는 것과 비슷한 원리라고 볼 수 있다.
그림자는 x좌표가 감소할 때와 y좌표가 증가할 때 생기므로, 이를 체크하여 그 차이의 2배만큼을 총합에 더해주면 문제를 풀 수 있다.
import sys
input = sys.stdin.readline
N = int(input())
a = [list(map(int, input().split())) for _ in range(N)]
x = 0
for i in range(N-1):
if i%2:
l = a[i][0]-a[i+1][0]
if l>0: x+=(2*l)
else:
l = a[i+1][1]-a[i][1]
if l>0: x+=(2*l)
print(x)
발상 자체는 어려운 편이 아니지만, 발상으로 풀겠다는 생각을 하기가 쉽지 않아 보인다. 대회에서 나온다면 은근 까다로울듯...