코딩 농장/백준 문제

[백준 Python] 15975번 화살표 그리기

GreenBNN 2022. 5. 22. 20:50

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

 

15975번: 화살표 그리기

직선위에 $N$개의 점들이 주어지고 각 점은 $N$개의 색깔 중 하나를 가진다. 편의상, 색깔은 1부터 $N$까지의 수로 표시 하고, 점들의 좌표는 모두 다르다. 각 점 $p$에 대해서, $p$에서 시작하는 직선

www.acmicpc.net

문제이해

수평선에 (좌표, 색) 점이 주어짐

각 점에서 같은 색을 가진 가까운 점의 거리를 구하고 다 더함

 

문제 풀이 흐름

결국 같은 색의 점들을 오름차순으로 모아둔 다음 양 옆의 가까운 점과 거리를 구하면 된다.

양 끝 점은 바로 옆 놈 더해주면 되고

 

# 수평선 (좌표, 색)
# 모든 점에 대해 같은 색이며 가장 가까운 점까지의 거리를 구하고
# 다 더함

num = int(input())

arr = []
sum = 0

# 입력 받을 때 공백 제거 방법


for i in range(num):
    a, b = map(int, input().split())
    arr.append([b, a]) # 색, 좌표

arr.sort() # 색으로 정렬 후 좌표로 정렬

for i in range(0,num):
    if i == 0:
        if arr[i][0] == arr[i+1][0]: # 다음 있으면
            sum += arr[i+1][1] - arr[i][1]
    elif i == num-1: 
        if arr[i][0] == arr[i-1][0]: # 이전 있으면
            sum += arr[i][1] - arr[i-1][1]
    else:
        if arr[i][0] == arr[i+1][0] and arr[i][0] == arr[i-1][0]: # 양쪽이 있으면
            if (arr[i+1][1] - arr[i][1]) > (arr[i][1] - arr[i-1][1]): # 더 작은 거리 더하기
                sum += arr[i][1] - arr[i-1][1]
            else:
                sum += arr[i+1][1] - arr[i][1]

        elif arr[i][0] == arr[i+1][0]: # 다음 만 있으면
            sum += arr[i+1][1] - arr[i][1]
        elif arr[i][0] == arr[i-1][0]: # 이전만 있으면
            sum += arr[i][1] - arr[i-1][1]
        else:
            sum += 0

print(sum)