문제 링크
문제 풀이
- 동근이와 상점의 위치에 따라 각 경우를 나누어야 한다.
- 먼저, 동근이와 상점이 북쪽, 남쪽으로 서로 마주보고 있을 때를 보면, 항상 세로 길이(y) 만큼은 움직이게 된다. 이때, 왼쪽으로 가는 경로(l+dl)와 오른쪽으로 가는 경로(x*2-l-dl)를 비교하여 더 작은 수만큼 이동하는 것이 최솟값이 된다.동근이와 상점이 서쪽, 동쪽으로 서로 마주보고 있을 때를 보면, 항상 가로 길이(x) 만큼은 움직이게 된다. 이때, 위로 가는 경로(l+dl)와 아래로 가는 경로(y*2-l-dl)를 비교하여 더 작은 수만큼 이동하는 것이 최솟값이 된다.
- 다음으로, 동근이와 상점이 서로 인접할 때를 보면, (북쪽, 서쪽), (북쪽, 동쪽), (남쪽, 서쪽), (남쪽, 동쪽)으로 총 4가지의 경우가 있다. 이는 맞닿은 곳을 기준으로 하여 그 기준점까지의 거리를 더하면 된다.
- 마지막으로, 동근이와 상점이 같은 방향에 있는 경우이다. 이때에는 동근이의 위치와 상점의 위치를 뺀 값의 절대값이 최솟값이 된다.
전체 코드
import sys
x, y = map(int, sys.stdin.readline().split())
n = int(sys.stdin.readline())
arr = [list(map(int, sys.stdin.readline().split())) for _ in range(n)]
dd, dl = map(int, sys.stdin.readline().split())
res = 0
for i in range(n):
d = arr[i][0]
l = arr[i][1]
# 동근이와 상점이 북쪽, 남쪽에 위치한 경우
if {d, dd} == {1, 2}:
res += y + min(l + dl, x * 2 - l - dl)
# 동근이와 상점이 서쪽, 동쪽에 위치한 경우
elif {d, dd} == {3, 4}:
res += x + min(l + dl, y * 2 - l - dl)
# 동근이와 상점이 맞닿은 경우
elif {d, dd} == {1, 3}:
res += l + dl
elif {d, dd} == {2, 3}:
if d == 3:
res += y - l +dl
else:
res += y - dl + l
elif {d, dd} == {1, 4}:
if d == 1:
res += x - l + dl
else:
res += x - dl + l
elif {d, dd} == {2, 4}:
res += x + y - l - dl
# 동근이와 상점이 같은 방향인 경우
else:
res += abs(l - dl)
print(res)
반응형
'Coding Test > BOJ' 카테고리의 다른 글
[백준/Python] 13164 행복 유치원 (0) | 2024.02.22 |
---|---|
[백준/Python] 12865 평범한 배낭 (0) | 2024.02.20 |
[백준/Python] 2343 기타 레슨 (2) | 2024.02.17 |
[백준/Python] 2170 선 긋기 (0) | 2024.02.17 |
[백준/Python] 10026 적록색약 (0) | 2024.02.15 |