코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int N, M, startPos = 0;
static long dist = 0;
static int[] arr;
static List<Integer> positive = new ArrayList<>();
static List<Integer> negative = new ArrayList<>();
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
arr = new int[N];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < N; i++) {
arr[i] = Integer.parseInt(st.nextToken());
}
Arrays.sort(arr);
int start = 0;
for (; start < N; ) {
if (arr[start] > 0) break;
negative.add(arr[start++]);
}
for (; start < N; ) {
positive.add(arr[start++]);
}
positive.sort(Collections.reverseOrder());
usePartOf(negative);
usePartOf(positive);
int positiveMax = 0;
int negativeMax = 0;
if (positive.size() > 0) {
positiveMax = positive.get(0);
}
if (negative.size() > 0) {
negativeMax = Math.abs(negative.get(0));
}
int toSub = Math.max(positiveMax, negativeMax);
System.out.println(dist - toSub);
}
private static void usePartOf(List<Integer> part) {
int startIdx = 0;
int bookCount = 0;
while (true) {
while (startIdx < part.size() && bookCount < M) {
if (bookCount == 0) {
startPos = part.get(startIdx);
}
bookCount++;
startIdx++;
}
dist += Math.abs(2 * startPos);
startPos = 0;
bookCount = 0;
if (startIdx == part.size()) {
return;
}
}
}
}
- 가장 멀리 있는 부분 먼저 책을 전달해주는 방식
- 이후 돌아오지 않아도 되는 때를 양수 좌표와 음수 좌표중 원점과 더 멀리있는 녀석으로 고르면 된다.