M,N = map(int,input().split())
S = int(input())
# 북쪽 1 ==>0
# 남쪽 2 ==>N-1
# 서쪽 3 =>0
# 동쪽 4 => N-1
input_list = []
total_length = (N+M)*2
for tc in range(S+1):
n1,n2 = map(int,input().split())
if n1 == 1:
input_list.append(n2)
elif n1 == 2:
input_list.append(M+N+(M-n2))
elif n1 == 3:
input_list.append(2*M+N+(N-n2))
else:
input_list.append(M+n2)
patrol = input_list[-1]
result = 0
for idx in range(S):
temp = abs(input_list[idx]-patrol)
result += min(temp,total_length-temp)
print(result)
이 문제를 처음 풀때는 여러가지 경우로 나눌까 하다가, 생각해보니 이 문제는 직사각형의 테두리만 도는 것이고, 테두리의 둘레 값은 고정적이다. 그래서 한쪽만 구하면 반대편 값은 저절로 구해지는 것을 알수 있었다.
그래서 사각형을 하나의 직선 좌표로 바꾸었다.
순서는 북->동->남->서 순으로 (0,0) 좌표를 끊었다고 생각했을때 쭉 눌어지는 것처럼 했다.
위와 같은 직사각형을 밑과 같은 일직선으로 변경 후 두 점사이의 거리를 구했다.
전체 둘레에서 두 점사이의 거리를 뺀값과 두점 사이의 거리 중 더 짧은 것을 결과값에 더해주었다.
'알고리즘 > 백준' 카테고리의 다른 글
[BOJ/백준] 11052 카드 구매하기 (0) | 2021.01.16 |
---|---|
[BOJ/백준] 17086 아기 상어 2 (0) | 2021.01.15 |
[BOJ] 5569 출근 경로 (0) | 2021.01.15 |
[BOJ] 2140 지뢰찾기 (0) | 2021.01.15 |
[BOJ] 1058 친구 (0) | 2021.01.14 |