
➡️문제 링크 : https://www.acmicpc.net/problem/2564
이 문제는 각 위치의 가게들과의 최소 거리를 구하는 문제이다. 이런 문제는 단순 구현 문제이고, 많은 조건 분기를 요하기 때문에 단순하고 신속하게 푸는 게 핵심이다. 나는 최대한 조건 분기를 줄이고 싶어서 '좌표' 로 만들었다. 좌표로 만들면 두 점의 x와 y 사이의 거리의 합만 구하면 바로 최단 거리가 구해지기 때문이다. 하지만 맞은편 (1은 2, 3과 4)의 두 점만큼은 그렇지 못하다. 이 점을 예외로 두기 위해 d 라는 배열을 만들어서 맞은편인지 여부를 체크하도록 했고, 맞은편에 위치한 가게인 경우라면 따로 계산하도록 했다.

만약 경비원이 남쪽에, 1번 가게가 북쪽에 위치하고 있을 때, 구할 수 있는 경로는 다음과 같은 2가지인데, 각 y 좌표의 절댓값의 합이던가, n 값에서 y 좌표값을 뺀 값의 합이던가 둘 중 하나이다. 이것은 각각 서/동 쪽에서 마주보고 있어도 같은 맥락이다. 따라서 서로 북/남인지, 서/동인지에 따라 두 경로값을 구한 후 더 작은 값을 ans에 추가했다.
코드는 다음과 같다.
import sys
input=sys.stdin.readline
n,m=map(int,input().split(' '))
t=int(input())
lst=[]
for i in range(t+1):
dir, dist=map(int,input().split(' '))
# 1이나 2일 경우 x 좌표가 0이나 m으로 지정됨
if dir==1:
lst.append((0,dist,dir))
elif dir==2:
lst.append((m,dist,dir))
# 3이나 4일 경우 y 좌표가 0이나 n으로 지정됨
elif dir==3:
lst.append((dist,0,dir))
else:
lst.append((dist,n,dir))
x,y,dir=lst[-1][0],lst[-1][1],lst[-1][2]
# 1일 경우 2, 2일 경우 1, 3일 경우 4, 4일 경우 3이 맞은편이다.
d=[0,2,1,4,3]
ans=0
for i in range(t):
a,b,l=lst[i][0],lst[i][1],lst[i][2]
# 맞은편일 경우 두 가지 경우의 수를 따로 계산
if l==d[dir]:
if l in (1,2):
ans+=min(b+y, n-b+n-y)+m
else:
ans+=min(a+x,m-a+m-x)+n
continue
# 맞은편이 아닌 경우 단순 좌표 절댓값 계산으로 경로 구함
ans+=abs(a-x)+abs(b-y)
print(ans)'알고리즘' 카테고리의 다른 글
| [백준] 1713 - 후보 추천하기 (3) | 2025.01.08 |
|---|---|
| [백준] 2531 - 회전 초밥 (0) | 2025.01.07 |
| [백준] 1446 - 지름길 (3) | 2025.01.06 |
| [백준] 2294 - 동전 2 (3) | 2025.01.05 |
| [백준] 1802 - 종이 접기 (9) | 2024.12.26 |