1 minute read

1461번 : 도서관

문제 링크

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

문제 설명

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

입력

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

출력

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

문제 풀이

n, m = map(int, input().split())
arr = list(map(int, input().split()))

# 입력받은 배열 정렬
arr.sort()

# 양수로 되는 배열 index 구하기, 모든 수가 음수면 반복문을 나올때 index + 1 
for i in range(len(arr)) : 
    if arr[i] > 0 : break
else : 
    i += 1

neg_arr = arr[:i]
pos_arr = list(reversed(arr[i:]))

# m번째 있는 숫자들을 다 더하고 * 2 하기 (왔다가 원점으로 돌아가기 때문)
# 절대값으로 가장 큰 숫자 빼기 (마지막은 원점으로 돌아올 필요없기 때문)
count = (abs(sum(neg_arr[::m])) + abs(sum(pos_arr[::m]))) * 2
count -= max(list(map(abs, arr)))

print(count)

Comments