파이썬 문제풀이/구현

[배준 파이썬]2564 경비원

ari0930 2024. 6. 16. 13:43

문제

동근이는 무인 경비 회사 경비원으로 항상 대기하고 있다가 호출이 들어오면 그곳으로 가야 한다 이때 블록을 가로질러갈 수 없다 그렇기에 1번 에서 호출이 들어올 경우 x에서 출발하여 1번까가는 거리는 시계방향으로 갈경우 12, 반시계 방향으로 갈 경우 18이 된다.

2번에서 호출이 들어올 경우 최단거리는 6이고 3번은 5가 된다 이때 각 상점  사이의 최단 거리의 합을 구하는 프로그램을 작성하시오.

입력

첫 번째 줄에의 블록의 가로 길이와 세로 길이가 주어진다.

둘째 줄에는 상점의 개수가 주어진다.

그다음 줄부터는 상점의 위치가 주어지는데  첫번째 수는 1은 북, 2는 남, 3은 서 , 4,는 동쪽을 의미하며 두 번째는 상점의 위치를 의미한다.

그리고 마지막 둘은 동근의 위치를 상점 위치과 같이 나타낸다.

 

출력

첫째 줄에 동근이의 위치와 각 상점 사이의 최단 거리의 합을 출력한다,

 

풀이

if문으로 막일 없이 풀어보려고 이것저것 해보았다 처음에는 좌표로 바꾸어서 풀어도 봤는데 쉽게 생각이 나지 않아 결국 if문으로 각각 분기점을 만들어서 풀었다,

 

그리고 풀고 난 후 다른 사람의 풀이를 찾아보니 하나의 직선 좌표형태로 나타내어 푸는 방법으로 푸는 것을 보았다.

이게 무슨 말이냐면 현재 보면 직사각형으로 그림이 그려져 있는걸 그냥 한 줄로 늘려서 직선좌표로 변환시킨 거다 문제에 나타나 있는걸 예로 들면 첫 번째 상점은  북, 4인데 이때 직선 좌표로 4가 된다.

두 번째 상점 서, 2인걸 직선 좌표로 나타내면  주어진 가로 a, 주어진  세로를 b라 한다면 a+b+a+2  기 된다 이처럼 직선좌표 형식으로 나타낼 수 있다.

 

이렇게 나타내면 현재 동근의 위치에서 다른 상점의 위치를 절댓값을 취해서 빼주기만 해 주면 된다. 단 이때 문제에서 나와있던 경우의 순이 반시계의 반향과 시계반향처럼 동근의 위치에서 상점을 위치를 빼준 길이를 구하고 난 후 총직사각형의 길이서 구한 걸 빼주면 반대 방향으로 갈 경우 거리를 알 수 있다.

 

코드(if 분기코드)

# 가로 세로 크기
a,b=map(int,input().split())

# 상점수
n=int(input())
array=[]
for i in range(n):
    x,y=map(int,input().split())
    array.append([x,y])


#  1
#3   4
#  2

# 현재 내위치
x,y=map(int,input().split())
ans=0
for i in range(n):
    count=1000000000
    x1,y1=array[i][0],array[i][1]
    if x==x1:
        count=min(count,abs(y-y1))
    elif((x==1 and x1==2)or(x==2 and x1==1)):
        count=min(y+b+y1,a-y+b+a-y1)
    elif((x==3 and x1==4)or(x==4 and x1==3)):
        count=min(y+a+y1,b-y+a+b-y1)
    elif(x==1 and x1==3):
        count=y+y1
    elif(x==1 and x1==4):
        count=a-y+y1
    elif(x==2 and x1==3):
        count=y+b-y1
    elif(x==2 and x1==4):
        count=a-y+b-y1
    elif(x==3 and x1==1):
        count=y+y1
    elif(x==3 and x1==2):
        count=b-y+y1
    elif(x==4 and x1==1):
        count=y+a-y1
    elif(x==4 and x1==2):
        count=b-y+a-y1
    ans+=count
print(ans)

 

코드(직선좌표화)

# 가로 세로 크기
a, b = map(int, input().split())

# 상점수
n = int(input())
shops = []
for _ in range(n):
    d, distance = map(int, input().split())
    if d == 1:  # 북쪽
        p = distance
    elif d == 2:  # 남쪽
        p = 2 * a + b - distance
    elif d == 3:  # 서쪽
        p = 2 * (a + b) - distance
    elif d == 4:  # 동쪽
        p = a + distance
    shops.append(p)

# 현재 내위치
d, distance = map(int, input().split())
if d == 1:  # 북쪽
    my = distance
elif d == 2:  # 남쪽
    my = 2 * a + b - distance
elif d == 3:  # 서쪽
    my = 2 * (a + b) - distance
elif d == 4:  # 동쪽
    my = a + distance

# 둘레
totaldi = 2 * (a + b)

# 최소 거리 계산
ans = 0
for i in shops:
    distance = abs(my - i)
    ans += min(distance, totaldi - distance)

print(ans)
반응형