난이도 : GOLD V
문제
각 책들의 원래 위치가 주어질 때, 책을 모두 제자리에 놔둘 때 드는 최소 걸음 수를 계산하는 프로그램을 작성
세준이는 한 걸음에 좌표 1칸씩 가며, 책의 원래 위치는 정수 좌표이다.
책을 모두 제자리에 놔둔 후에는 다시 0으로 돌아올 필요는 없다.
그리고 세준이는 한 번에 최대 M권의 책을 들 수 있다.
문제해결
- plus와 minus 로 구분 한 다음
- 내림차순 정렬 후 한번에 움직일 수 있는 책의 권수(m) x len(plus,minus)//m 으로 계산한다
- 가장 거리가 먼 책은 마지막에 놔둔다. (돌아올 필요가 없기 때문에)
import sys
input = sys.stdin.readline
n,m = map(int,input().split())
dis = list(map(int, input().split()))
minus = []
plus = []
count = []
for i in dis:
if i < 0:
minus.append(abs(i))
else :
plus.append(i)
minus.sort(reverse=True)
plus.sort(reverse=True)
for i in range(len(minus)//m):
count.append(minus[i*m])
if len(minus) % m > 0:
count.append(minus[(len(minus)//m) * m])
for i in range(len(plus)//m):
count.append(plus[i*m])
if len(plus) % m > 0:
count.append(plus[(len(plus)//m) * m])
count.sort()
ans = count.pop() # 가장 먼거리 추출
ans += 2*sum(count)
print(ans)