본문 바로가기

Coding Test/BOJ

[백준/Python] 2564 경비원

문제 링크

 

2564번: 경비원

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

www.acmicpc.net

 

문제 풀이

  • 동근이와 상점의 위치에 따라 각 경우를 나누어야 한다.
  • 먼저, 동근이와 상점이 북쪽, 남쪽으로 서로 마주보고 있을 때를 보면, 항상 세로 길이(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