[백준] 2564 - 경비원
1. 문제
2. 개요
직사각형 둘레에 주어진 한 점을 기준으로 각각의 점들까지의 최소거리의 합을 구하는 문제.
3. 코드 및 추가내용
import sys
w, h = map(int, sys.stdin.readline().split())
rectdist = (w + h) * 2
n = int(sys.stdin.readline())
ans = 0
clockdists = []
for i in range(n):
direc, dist = map(int, sys.stdin.readline().split()) # 1234 북남서동
if direc == 1:
clockdists.append(h+dist)
elif direc == 2:
clockdists.append(rectdist-dist)
elif direc == 3:
clockdists.append(h-dist)
else:
clockdists.append(h+w+dist)
dgdirec, dgdist = map(int, sys.stdin.readline().split())
if dgdirec == 1:
cdist = h+dgdist
elif dgdirec == 2:
cdist = rectdist-dgdist
elif dgdirec == 3:
cdist = h-dgdist
else:
cdist = h+w+dgdist
for d in clockdists:
rcdsit = abs(d - cdist)
ans += min(rcdsit, rectdist - rcdsit)
print(ans)
모든 이동은 직사각형의 변을 따라 움직여야 하므로 시계방향 이동, 반시계방향 이동 두 가지로 좁힐 수 있다.
근데 기준점을 중심으로 이동을 구현하려니 귀찮을거같았다.
그래서 처음에 입력받을 때 영점 기준 시계방향 이동 거리를 먼저 구하고 리스트에 저장한다.
그리고 기준점 또한 시계방향 이동 거리를 구해준다.
리스트들을 돌면서 거리의 최솟값을 계산한다.
최솟값이라고 해봐야 시계방향, 반시계방향 이동 시 거리인데, 반시계방향 이동 거리는
직사각형 둘레 - 시계방향 이동 거리로 구할 수 있으므로 두 값중 작은값들을 계속 더해나가면 된다.
Comments