알고리즘

[BOJ-1641] 도서관 JAVA 풀이

sppl24 2024. 9. 30. 23:36
반응형

도서관

문제

세준이는 도서관에서 일한다.

도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다.

세준이는 현재 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);
    }
}
반응형