[Python] BOJ 2564 - 경비원

728x90
반응형

https://www.acmicpc.net/problem/2564

 

2564번: 경비원

첫째 줄에 블록의 가로의 길이와 세로의 길이가 차례로 주어진다. 둘째 줄에 상점의 개수가 주어진다. 블록의 가로의 길이와 세로의 길이, 상점의 개수는 모두 100이하의 자연수이다. 이어 한 줄

www.acmicpc.net

# 단순 구현문제이다. 여러가지 Case를 나누어 주고 구현하면 된다.

 

# 만약 동근이와 상점이 북쪽, 남쪽에 있는경우는 2가지로 더 나누어주면 되는데,

   동근이가 북쪽에 있고, 상점이 남쪽에 있을때 a와 b값에 따라 최단거리가 달라진다. (아래그림 참고)

   a+b가 w보다 작으면 answer에 a+b+h를 더해주고 아니면, w-a+w-b+h를 더해준다.

 

   동쪽, 서쪽에 있는 경우도 마찬가지이다. w대신 h, h대신 w를 넣어주면된다.

    

 

# 마주보고 있는 경우가 아닌 경우는 하나하나 케이스를 다 나누어줘서 answer에 더해주었다.

 

import sys
input = sys.stdin.readline
w, h = map(int,input().split())
n = int(input())
xlist, ylist = [], []
def solve(xlist, ylist):
    answer = 0
    for i in range(n):
        if sx == xlist[i]:
            answer += abs(sy - ylist[i])
        elif (sx, xlist[i]) == (1, 2) or (sx, xlist[i]) == (2, 1):
            if sy + ylist[i] < w:
                answer += sy + ylist[i] + h
            else:
                answer += w-sy + w-ylist[i] + h
        elif (sx, xlist[i]) == (3, 4) or (sx, xlist[i]) == (4, 3):
            if sy + ylist[i] < h:
                answer == sy + ylist[i] + w
            else:
                answer += h-sy + h-ylist[i] + w
        elif (sx, xlist[i]) == (1, 3) or (sx, xlist[i]) == (3, 1):
            answer += sy + ylist[i]
        elif (sx, xlist[i]) == (1, 4):
            answer += w-sy + ylist[i]
        elif (sx, xlist[i]) == (4, 1):
            answer += sy + w-ylist[i]
        elif (sx, xlist[i]) == (2, 3):
            answer += sy + h-ylist[i]
        elif (sx, xlist[i]) == (3, 2):
            answer += h-sy + ylist[i]
        elif (sx, xlist[i]) == (2, 4) or (sx, xlist[i]) == (4, 2):
            answer += w-sy + h-ylist[i]

    return answer
for _ in range(n):
    x, y = map(int,input().split())
    xlist.append(x)
    ylist.append(y)
sx, sy = map(int,input().split())
print(solve(xlist, ylist))

(solve.ac 티어: 실버 1)

728x90
반응형
TAGS.

Comments