Algorithm/Algorithm Problem

백준 1461 도서관(구현, 그리디)

땅지원 2022. 6. 3. 20:04

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

 

1461번: 도서관

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책

www.acmicpc.net

규칙을 찾는게 중요한 문제였다. 시작점 0에서 음수, 양수 편을 나누고 m만큼 left[m * i] , right[m * i] 간다음에

제일 큰 수에서는 0으로 다시 돌아오지 않고 그 자리에서 끝나면 된다.

 

유의할점은 left, right의 길이가 m으로 나누어 떨어지지 않을 경우 나머지 k만큼 먼저 간다음에 k에서 시작하여

m*i 만큼 계속 더해주는게 핵심이였다.

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

left = []
right = []
max_value = 0
for i in data:
    if i < 0:
        left.append(-i)
        max_value = max(max_value,-i)
    else:
        right.append(i)
        max_value = max(max_value,i)

res = 0
left = left[::-1]


left_value = len(left) // m
left_remainer = len(left) % m
right_value = len(right) // m
right_remainer = len(right) % m

if left_remainer > 0:
    idx = left_remainer-1
    for i in range(idx,len(left),m):
        res += left[i] * 2
else:
    for i in range(m-1,len(left),m):
        res += left[i] * 2

if right_remainer > 0:
    idx = right_remainer-1
    for i in range(idx,len(right),m):
        res += right[i] * 2
else:
    for i in range(m-1,len(right),m):
        res += right[i] * 2
print(res - max_value)