반응형
도서관
문제
세준이는 도서관에서 일한다.
도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다.
세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다.
각 책들의 원래 위치가 주어질 때, 책을 모두 제자리에 놔둘 때 드는 최소 걸음 수를 계산하는 프로그램을 작성하시오.
세준이는 한 걸음에 좌표 1칸씩 가며, 책의 원래 위치는 정수 좌표이다.
책을 모두 제자리에 놔둔 후에는 다시 0으로 돌아올 필요는 없다.
그리고 세준이는 한번에 최대 M권의 책을 들 수 있다.
첫째 줄에 책의 개수 N과, 세준이가 한 번에 들 수 있는 책의 개수 M이 주어진다.
둘째 줄에는 책의 위치가 주어진다.
N과 M은 50보다 작거나 같은 자연수이다.
책의 위치는 0이 아니며, 절댓값은 10,000보다 작거나 같은 정수이다.
아이디어
- 0을 반복해서 지나지 않기 위해 +와 -를 분리한다.
- 가장 먼 순서대로 M개씩 (최댓값) 묶음 처리
- 마지막에 0으로 돌아오지 않아도 된다. -> 마지막에 가장 먼 곳 처리 (최댓값을 한번 뺌)
JAVA 풀이
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();
int M = sc.nextInt();
int last = 0;
int move = 0;
PriorityQueue<Integer> plus = new PriorityQueue<>(Collections.reverseOrder());
PriorityQueue<Integer> minus = new PriorityQueue<>(Collections.reverseOrder());
for (int i = 0; i < N; i++) {
int a = sc.nextInt();
if (a >= 0) {
plus.add(a);
} else {
// 절대값 처리
minus.add(Math.abs(a));
}
}
// 마지막 값 (가장 먼 거리)
if (plus.isEmpty()) {
last = minus.peek();
} else if (minus.isEmpty()) {
last = plus.peek();
} else {
last = Math.max(minus.peek(), plus.peek());
}
// M개 묶음 처리
while (!plus.isEmpty()) {
move += plus.peek();
for (int i = 0; i < M; i++) {
plus.poll();
}
}
while (!minus.isEmpty()) {
move += minus.peek();
for (int i = 0; i < M; i++) {
minus.poll();
}
}
System.out.println((move * 2) - last);
}
}
반응형
'알고리즘' 카테고리의 다른 글
[LEETCODE] 706. Design HashMap (1) | 2024.10.09 |
---|---|
[프로그래머스] - 숫자 변환하기 JAVA 풀이 (0) | 2024.10.08 |
[프로그래머스] PCCP 기출문제 - 붕대 감기 JAVA 풀이 (0) | 2024.10.04 |
[프로그래머스] 정수를 나선형으로 배치하기 JAVA 풀이 (0) | 2024.10.02 |
[프로그래머스] PCCP 기출문제 - 동영상 재생기 JAVA 풀이 (0) | 2024.10.01 |