알고리즘

[백준] 2564 - 경비원

bluealice 2025. 1. 7. 12:46

백준 2564번 경비원

 

➡️문제 링크 : 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