[백준]#1461 도서관

SeungBird·2020년 8월 26일
0

⌨알고리즘(백준)

목록 보기
51/401

문제

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책들의 원래 위치가 주어질 때, 책을 모두 제자리에 놔둘 때 드는 최소 걸음 수를 계산하는 프로그램을 작성하시오. 세준이는 한 걸음에 좌표 1칸씩 가며, 책의 원래 위치는 정수 좌표이다. 책을 모두 제자리에 놔둔 후에는 다시 0으로 돌아올 필요는 없다. 그리고 세준이는 한 번에 최대 M권의 책을 들 수 있다.

입력

첫째 줄에 책의 개수 N과, 세준이가 한 번에 들 수 있는 책의 개수 M이 주어진다. 둘째 줄에는 책의 위치가 주어진다. N은 10,000보다 작거나 같은 자연수이고, M은 10,000보다 작거나 같다. 책의 위치는 0이 아니며, 그 절댓값이 10,000보다 작거나 같다.


첫째 줄에 정답을 출력한다.

예제 입력 1

7 2
-37 2 -6 -39 -29 11 -28

예제 출력 1

131

풀이

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;

public class Main {

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        String[] input = br.readLine().split(" ");
        ArrayList<Integer> minus = new ArrayList<>();
        ArrayList<Integer> plus = new ArrayList<>();
        int N = Integer.parseInt(input[0]);
        int M = Integer.parseInt(input[1]);
        String[] books = br.readLine().split(" ");
        long sum = 0;
        int maxFlag = 0;

        for(int i=0; i<N; i++) {
            int book = Integer.parseInt(books[i]);

            if(book<0) {
                minus.add(Math.abs(book));
            }
            else
                plus.add(book);
        }
        Collections.sort(minus, Collections.reverseOrder());
        Collections.sort(plus, Collections.reverseOrder());

        if(!minus.isEmpty() && !plus.isEmpty()) {
            if(minus.get(0)>plus.get(0))
                maxFlag--;
            else
                maxFlag++;
        }

        else {
            if(minus.isEmpty())
                maxFlag++;
            else
                maxFlag--;
        }

        ArrayList<Integer> tmp = maxFlag<0 ? minus : plus;
        sum += tmp.remove(0);

        int i=0;
        while(!tmp.isEmpty()) {
            if(i==M-1)
                break;
            tmp.remove(0);
            i++;
        }

        for(int j=0; j<2; j++) {

            if (j==0)
                tmp = minus;
            else
                tmp = plus;

            int idx = 0;

            while (!tmp.isEmpty()) {

                if (idx==0)
                    sum += tmp.remove(0)*2;
                else
                    tmp.remove(0);

                idx++;
                idx%=M;
            }
        }
        System.out.println(sum);
    }
}
profile
👶🏻Jr. Programmer

0개의 댓글