본문 바로가기
코딩/백준-자바

[자바] 백준 1461번: 도서관

by 철없는민물장어 2023. 1. 3.
728x90
반응형

https://www.acmicpc.net/problem/1461

 

1461번: 도서관

세준이는 도서관에서 일한다. 도서관의 개방시간이 끝나서 세준이는 사람들이 마구 놓은 책을 다시 가져다 놓아야 한다. 세준이는 현재 0에 있고, 사람들이 마구 놓은 책도 전부 0에 있다. 각 책

www.acmicpc.net


원점으로부터 먼 곳부터 돌면서 m개씩 한번에 반납한다.

마지막 한 번은 원점까지 돌아올 필요가 없으므로 가는길 만큼만 더해준다.

 

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Collections;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class P1461 {

	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());

		st = new StringTokenizer(br.readLine());
		LinkedList<Integer> book_down0 = new LinkedList<>();
		LinkedList<Integer> book_over0 = new LinkedList<>();
		for (int i = 0; i < n; i++) {
			int book = Integer.parseInt(st.nextToken());
			if (book > 0)
				book_over0.add(book);
			else if (book < 0)
				book_down0.add(book);

		}

		int result = 0;

		Collections.sort(book_down0);
		Collections.sort(book_over0, Collections.reverseOrder());

		if (book_down0.isEmpty() && book_over0.isEmpty()) {
			System.out.println(0);
			return;
		} else if (book_down0.isEmpty() || book_over0.isEmpty()) {
			if (book_down0.isEmpty()) {
				result += book_over0.pop();
				for (int i = 0; i < m - 1 && !book_over0.isEmpty(); i++) {
					book_over0.pop();
				}
			} else {
				result += -book_down0.pop();
				for (int i = 0; i < m - 1 && !book_down0.isEmpty(); i++) {
					book_down0.pop();
				}
			}

		}
		else if ((-book_down0.peek() <= book_over0.peek())) {
			result += book_over0.pop();
			for (int i = 0; i < m - 1 && !book_over0.isEmpty(); i++) {
				book_over0.pop();
			}
		} else {
			result += -book_down0.pop();
			for (int i = 0; i < m - 1 && !book_down0.isEmpty(); i++) {
				book_down0.pop();
			}
		}

		while (!book_down0.isEmpty()) {
			result += (-book_down0.remove() * 2);
			for (int i = 0; i < m - 1 && !book_down0.isEmpty(); i++) {
				book_down0.remove();
			}
		}
		while (!book_over0.isEmpty()) {
			result += (book_over0.remove() * 2);
			for (int i = 0; i < m - 1 && !book_over0.isEmpty(); i++) {
				book_over0.remove();
			}
		}

		System.out.println(result);
	}

}

어쩌다보니 if문이 너무나도 많아졌다

(코드를 짜다가 문제를 발견하고 하나씩 덧붙이다 보니 보기에 안 좋아졌다)

 

우선 책 위치를 모두 입력받은 후,

원점에서 가장 멀리있는 책은 미리 빼둔다.

(가장 마지막에 반납하는 책은 원점까지 돌아가지 않아도 되므로 

가장 멀리있는 책을 가장 마지막에 반납한다고 생각하고 미리 계산 해 둔다)

 

그리고 while문을 통해

가장 멀리있는 책부터 m개씩 한번에 반납하고 돌아온다.

 

728x90
반응형

댓글