백준 온라인 저지, 그리디 / 1461번: 도서관 (파이썬 / 백준 골드문제)

2021. 9. 1. 21:17알고리즘/그리디

728x90
반응형

문제

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

문제 정의

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책들의 원래 위치가 주어질 때, 책을 모두 제자리에 놔둘 때 드는 최소 걸음 수를 계산하는 프로그램을 작성하시오. 세준이는 한 걸음에 좌표 1칸씩 가며, 책의 원래 위치는 정수 좌표이다. 책을 모두 제자리에 놔둔 후에는 다시 0으로 돌아올 필요는 없다. 그리고 세준이는 한 번에 최대 M권의 책을 들 수 있다.


입력

첫째 줄에 책의 개수 N과, 세준이가 한 번에 들 수 있는 책의 개수 M이 주어진다. 둘째 줄에는 책의 위치가 주어진다. N은 10,000보다 작거나 같은 자연수이고, M은 10,000보다 작거나 같다. 책의 위치는 0이 아니며, 그 절댓값이 10,000보다 작거나 같다.


출력

첫째 줄에 정답을 출력한다.


예제 입력 1

7 2
-37 2 -6 -39 -29 11 -28

예제 출력 1

131

접근 방법

- 주어진 책의 위치를 음수와 양수로 구분해 각각 리스트에 저장한다. 단, 책의 위치가 음수인 경우 음수를 곱해 이를 추가한다. 이후 리스트를 내림차순으로 정렬한다.
- 절대값을 기준으로 가장 높은 숫자를 저장하여 총 이동거리에서 빼준다.
- m번을 step으로 가지는 반복문을 사용해 m의 배수에 해당하는 값을 2를 곱하여 이동거리에 더한다.
- 이후 모든 탐색이 끝나면 총 이동거리를 출력한다.

코드

# https://www.acmicpc.net/problem/1461
# 접근 방법
# 주어진 책의 위치를 음수와 양수로 구분해 각각 리스트에 저장한다. 단, 책의 위치가 음수인 경우 음수를 곱해 이를 추가한다. 이후 리스트를 내림차순으로 정렬한다.
# 절대값을 기준으로 가장 높은 숫자를 저장하여 총 이동거리에서 빼준다.
# m번을 step으로 가지는 반복문을 사용해 m의 배수에 해당하는 값을 2를 곱하여 이동거리에 더한다.
# 이후 모든 탐색이 끝나면 총 이동거리를 출력한다.
n, m = map(int, input().split())
minus = []
plus = []
max_value = 0
for x in list(map(int, input().split())):
    max_value = max(max_value, abs(x))
    if x > 0:
        plus.append(x)
    else:
        minus.append(-x)
        
plus.sort(reverse=True)
minus.sort(reverse=True)

total_distance = -max_value
for i in range(0, max(len(plus), len(minus)), m):
    if len(plus) > i:
        total_distance += plus[i] * 2
    if len(minus) > i:
        total_distance += minus[i] * 2
        
print(total_distance)
728x90
반응형