본문 바로가기
Language/Java

[백준 | Java] 31860번 열심히 일하는 중 - Priority Queue

by ㅇ달빛천사ㅇ 2025. 2. 21.
728x90
31860번 / 열심히 일하는 중

열심히 일하는 중

🏷️ 관련 주제 : Priority Queue



💦 나의 시도

우선순위 큐를 이용한 풀이

  1. BufferedReaderStringTokenizer
    일의 개수 int N,
    일을 처리한 후 감소하는 일의 중요도 int M,
    일의 완료 기준 int K
    를 입력 받아 int형 변환 후 할당
  2. PriorityQueue task를 내림차순 정렬로 선언 : 작업의 우선순위를 담을 우선순위 큐
  3. 0 ~ (N - 1)의 범위를 반복문을 돌면서 작업의 중요도를 task에 담기
  4. 송이가 모든 일을 끝낼 때까지 걸린 일 수 int day를 0으로 초기화
  5. 전날의 만족감 int Y를 0으로 초기화
  6. task가 비어있지 않은 동안 반복문을 돌며 일 처리
    • day 1증가
    • 가장 중요한 일 task에서 꺼내서(task.poll()) int P에 할당
    • 오늘의 만족감 구해서(Y / 2 + P) Y에 할당
    • StringBuffer에 (오늘의 만족감) + 줄바꿈("\n") 추가
    • 오늘 처리한 작업의 중요도 감소시키기(P -= M)
    • 만약 처리된 작업의 중요도가 K 초과이면 아직 작업이 완료되지 않은 것이므로 task에 다시 추가(task.add(P))
  7. day 출력
  8. StringBuffer sb 출력

📑제출 기록 및 오답 원인



💯 해결 방법

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

public class Main {
    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());
        int K = Integer.parseInt(st.nextToken());

        PriorityQueue<Integer> task = new PriorityQueue<>(Comparator.reverseOrder());

        for (int i = 0; i < N; i++) {
            task.add(Integer.parseInt(br.readLine()));
        }

        StringBuffer sb = new StringBuffer();

        int day = 0;
        int Y = 0;
        while (!task.isEmpty()) {
            day++;
            int P = task.poll();
            Y = Y / 2 + P;
            sb.append(Y+"\n");
            P -= M;

            if (P > K) {
                task.add(P);
            }
        }

        System.out.println(day);
        System.out.println(sb);
    }
}
728x90


Top