ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준]6068: 시간 관리하기 - JAVA
    문제풀이/백준 2021. 8. 24. 16:14

    [백준]6068: 시간 관리하기

     

    6068번: 시간 관리하기

    성실한 농부 존은 시간을 효율적으로 관리해야 한다는 걸 깨달았다. 그는 N개의 해야할 일에 (1<=N<=1000) 숫자를 매겼다. (우유를 짜고, 마굿간을 치우고, 담장을 고치는 등의) 존의 시간을 효율적

    www.acmicpc.net

    풀이

    🪑 자료구조를 사용하여 풀었다. 비슷한 유형의 문제가 많을 것 같은 문제였다.

     

    📝 문제를 정리해 보자!

    • 해야 할 일이 존재한다.
    • 일을 하는데 필요한 시간과 끝내야 하는 시간이 주어진다.
    • 가장 늦게 일어나도 되는 시간을 구한다.

     

     

    🔧 문제를 풀어 보자!

    1. 입력받은 할 일을 끝내야 하는 시간을 기준으로 오름차순 정렬하여 우선순위큐에 담는다.
    2. 우선순위큐에서 하나씩 할 일의 정보를 꺼낸다.
    3. 총 업무 시간을 누적하여 더해주고, 현재 업무를 끝내야 하는 시간에서 총 업무 시간을 뺀 값 중의 최소값을 찾는다.
    4. 중간에 총 업무 시간이 현재 업무를 끝내야 하는 시간보다 크다면 제 시간에 일을 끝낼 수 없다는 의미이므로 -1을 출력한다.

     

     

    🔹 할 일을 끝내야 하는 시간을 기준으로 오름차순 정렬하여 우선순위큐에 담는다.

    • 먼저 끝내야 할 일을 먼저 처리해 주기 위함이다.

     

     

    🔹 우선순위큐에서 하나씩 할 일의 정보를 꺼낸다.

    • 순서대로 할 일을 진행해 준다는 의미이다.

     

    🔹 총 업무 시간을 누적하여 더해주고, 현재 업무를 끝내야 하는 시간에서 총 업무 시간을 뺀 값 중의 최소값을 찾는다.

    • 총 업무 시간은 지금까지 업무를 진행한 총 시간을 의미하므로 누적하여 더해준다.
    • 현재 업무를 끝내야 하는 시간에서 총 업무 시간을 빼면 업무를 시작해야 하는 시간(적어도 이 시간에는 업무를 시작해야 하는 시간)을 알 수 있다.
    • 해당 시간 중에서 최소 값을 찾아주면 그 값이 가장 늦게 일어날 수 있는 시간이 된다.

     

     

    🔹 총 업무 시간이 현재 업무를 끝내야 하는 시간보다 크다면 제 시간에 일을 끝낼 수 없다.

    • 이럴 때는 -1을 출력해 주면 된다.

     

    코드

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    //6068: 시간 관리하기
    import java.io.*;
    import java.util.*;
     
    public class Main {
        public static void main(String[] args) throws IOException {
     
            //입력
            BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
            int n = Integer.parseInt(bf.readLine());
     
            PriorityQueue<Node> work_list = new PriorityQueue<>((o1, o2) -> o1.end_time - o2.end_time);
            for(int i = 0; i < n ; i++) {
                String str = bf.readLine();
                StringTokenizer st = new StringTokenizer(str);
                int t = Integer.parseInt(st.nextToken());
                int e = Integer.parseInt(st.nextToken());
                work_list.add(new Node(t, e));
            }
            //입력 끝
     
            int total_time = 0;
            int min_start_time = Integer.MAX_VALUE;
            boolean isDone = true;
            while(!work_list.isEmpty()) {
                Node current = work_list.poll();
                total_time += current.time;
                min_start_time = Math.min(min_start_time, current.end_time - total_time);
                if(total_time > current.end_time) {
                    isDone = false;
                    break;
                }
            }
            if(!isDone) System.out.println("-1");
            else System.out.println(min_start_time);
        }
     
        public static class Node {
            int time, end_time;
     
            public Node(int time, int end_time) {
                this.time = time;
                this.end_time = end_time;
            }
        }
    }
    cs
     

    댓글

Designed by Tistory.