본문 바로가기
BOJ

[JAVA]백준 1461- 도서관

by yujinkimkim 2023. 8. 28.

1461번: 도서관 (acmicpc.net)

1461번: 도서관

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

www.acmicpc.net

 

package baekjoon;

import java.util.*;
import java.io.*;

public class b1461 {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		
		PriorityQueue<Integer> pq = new PriorityQueue<>((p1, p2) -> p2 - p1);
        PriorityQueue<Integer> nq = new PriorityQueue<>((p1, p2) -> p2 - p1);
		
		st = new StringTokenizer(br.readLine());
		for(int i = 0 ; i < n; i++) {
			int tmp = Integer.parseInt(st.nextToken());
			if(tmp < 0)
				nq.offer(Math.abs(tmp));
			else
				pq.offer(tmp);
		}
		
		int maxNum = 0;
        if (pq.isEmpty()) {
        	maxNum = nq.peek();
        } else if (nq.isEmpty()) {
        	maxNum = pq.peek();
        } else {
        	maxNum = Math.max(pq.peek(), nq.peek());
        }
        
        int ans = cal(pq, m);
        ans += cal(nq, m);
        ans -= maxNum;
        bw.write(ans + "");
        bw.close();
	}
	public static int cal(PriorityQueue<Integer> q, int m) {
		int ans = 0;

        while (!q.isEmpty()) {
            int tmp = q.poll();
            for (int i = 0; i < m - 1; i++) {
                q.poll();

                if (q.isEmpty()) {
                    break;
                }
            }
            ans += tmp * 2;
        }
        return ans;
	}
}

package baekjoon;

import java.util.*;
import java.io.*;

public class b1461 {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int maxNum = Integer.parseInt(st.nextToken());
		ArrayList<Integer> arr = new ArrayList<>();
		ArrayList<Integer> Uarr = new ArrayList<>();
		
		st = new StringTokenizer(br.readLine());
		for(int i = 0 ; i < n; i++) {
			int tmp = Integer.parseInt(st.nextToken());
			if(tmp < 0)
				Uarr.add(Math.abs(tmp));
			else
				arr.add(tmp);
		}
		
		if(arr.isEmpty())
			arr.add(0);
		else if(Uarr.isEmpty())
			Uarr.add(0);
		
		Collections.sort(arr);
		Collections.sort(Uarr);
		
		int ans = 0;
		if(Collections.max(arr) <= Collections.max(Uarr)) {
			ans = cal(arr, Uarr, maxNum);
		}
		else {
			ans = cal(Uarr, arr, maxNum);
		}
		
		bw.write(ans+"");
		bw.close();
	}
	public static int cal(ArrayList<Integer> arr, ArrayList<Integer> uarr, int m) {
		int ans = 0;
		for(int i = arr.size()-1; i >= 0 ; i-=m) {
			if(i % m == 1 || m == 1) {
				ans += arr.get(i) * 2;
			}
			else if(i == arr.size()-1) {
				ans += arr.get(i) * 2;
			}
		}
		for(int i = uarr.size()-1 ; i >= 0 ;i-=m) {
			if(i >= uarr.size()-m-1) {
				ans += uarr.get(i);
			}
			else {
				ans += uarr.get(i) * 2;
			}
		}
		return ans;
	}
}

반례 하나 빼고 다른 예제는 다 잘 돌아가는데 제출하면 1%도 아니고 걍 바로 틀렸습니다 나와요...진짜...ㅠ

여기저기 고치다가...홧병걸려서 쓰러지는게 더 빠를 거 같아서...구글링 하기로 했어요...

package baekjoon;

import java.util.*;
import java.io.*;

public class b1461 {

	public static void main(String[] args) throws IOException{
		// TODO Auto-generated method stub
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		
		PriorityQueue<Integer> pq = new PriorityQueue<>((p1, p2) -> p2 - p1);
        PriorityQueue<Integer> nq = new PriorityQueue<>((p1, p2) -> p2 - p1);
		
		st = new StringTokenizer(br.readLine());
		for(int i = 0 ; i < n; i++) {
			int tmp = Integer.parseInt(st.nextToken());
			if(tmp < 0)
				nq.offer(Math.abs(tmp));
			else
				pq.offer(tmp);
		}
		
		int maxNum = 0;
        if (pq.isEmpty()) {
        	maxNum = nq.peek();
        } else if (nq.isEmpty()) {
        	maxNum = pq.peek();
        } else {
        	maxNum = Math.max(pq.peek(), nq.peek());
        }
        
        int ans = cal(pq, m);
        ans += cal(nq, m);
        ans -= maxNum;
        bw.write(ans + "");
        bw.close();
	}
	public static int cal(PriorityQueue<Integer> q, int m) {
		int ans = 0;

        while (!q.isEmpty()) {
            int tmp = q.poll();
            for (int i = 0; i < m - 1; i++) {
                q.poll();

                if (q.isEmpty()) {
                    break;
                }
            }
            ans += tmp * 2;
        }
        return ans;
	}
}

되게 구글링 하니까 
이렇게 하면 될걸 싶은 되게 명쾌한 답을 얻은 느낌? 이었습니다 ㅠ 
[BOJ] 백준 1461번 : 도서관 (JAVA) (tistory.com)

10 1
9999 -999 8888 -8888 -9999 1 2 -45 -56 88

-> 67931

이 반례 참고하시면 좋을 거 같아요
이거 원래 제 코드에서는 안 돌아갔었거든요!
 

댓글