문제
백준 1461번 - 도서관
아이디어
- 걸음 수가 최소가 되기 위해서는 가장 먼 거리를 마지막으로 가서 다시 돌아오는 거리를 줄이는 것이 유리하다.
- 책 위치 좌표를 정렬하여 0에서 가장 먼 거리의 위치를 구한다.
- 위치를 음수와 양수로 나누어서 계산한다. 그리고 책을 최대
M
권 들 수 있으므로 남은 책 위치 중 가장 먼 거리를 가면서 바로 옆에 있는 위치에도 책을 놓을 수 있으므로 M
칸씩 건너뛴다. 이들의 왕복 거리를 계산하여 총합을 구한다.
- 이 총합에서 가장 먼 거리의 위치를 뺀 값이 가장 먼 거리의 위치를 마지막으로 가서 다시 되돌아오지 않은 것이므로 정답이 된다.
예상 시간 복잡도
- 책의 개수 :
N
- 예상 시간 복잡도 : `O(N log N)
코드 구현
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
public class BJ_1461 {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
int[] 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 sum = 0;
int max = Math.max(Math.abs(arr[0]), Math.abs(arr[n - 1])); //0에서 가장 먼 거리의 위치
//음수 위치
for (int i = 0; i < n; i += m) {
if (arr[i] < 0) {
sum += Math.abs(arr[i] * 2);
} else {
break;
}
}
//양수 위치
for (int i = n - 1; i >= 0; i -= m) {
if (arr[i] > 0) {
sum += Math.abs(arr[i] * 2);
} else {
break;
}
}
System.out.println(sum - max);
}
}