1461 - 도서관(java)

Byung Seon Kang·2022년 12월 5일
0

코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

/**
 * @Author: kbs
 */
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;
            }
        }
    }
}
  • 가장 멀리 있는 부분 먼저 책을 전달해주는 방식
    • 좌표가 양수인 부분과 음수인 부분을 나눴다.
  • 이후 돌아오지 않아도 되는 때를 양수 좌표와 음수 좌표중 원점과 더 멀리있는 녀석으로 고르면 된다.
profile
왜 필요한지 질문하기

0개의 댓글