알고리즘/[ Baekjoon ]

[ BOJ ][JAVA][19622] 회의실 배정 3

kim.svadoz 2021. 5. 21. 20:15
반응형

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

 

19622번: 회의실 배정 3

서준이는 아빠로부터 N개의 회의와 하나의 회의실을 선물로 받았다. 각 회의는 시작 시간, 끝나는 시간, 회의 인원이 주어지고 한 회의실에서 동시에 두 개 이상의 회의가 진행될 수 없다. 단,

www.acmicpc.net

시간 제한 메모리 제한 제출 정답 맞은 사람 정답 비율
1 초 256 MB 311 148 105 43.388%

문제

서준이는 아빠로부터 N개의 회의와 하나의 회의실을 선물로 받았다. 각 회의는 시작 시간, 끝나는 시간, 회의 인원이 주어지고 한 회의실에서 동시에 두 개 이상의 회의가 진행될 수 없다. 단, 회의는 한번 시작되면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작 시간은 끝나는 시간보다 항상 작다. N개의 회의를 회의실에 효율적으로 배정할 경우 회의를 진행할 수 있는 최대 인원을 구하자.

입력

첫째 줄에 회의의 수 N이 주어진다. 둘째 줄부터 N + 1 줄까지 공백을 사이에 두고 회의의 시작시간, 끝나는 시간, 회의 인원이 주어진다.

출력

첫째 줄에 회의실에서 회의를 진행할 수 있는 최대 인원을 출력한다.

제한

  • 1 ≤ N ≤ 100,000
  • 임의의 회의 K(1≤ K ≤ N)는 회의 K − 1과 회의 K + 1과는 회의 시간이 겹치고 다른 회의들과는 회의 시간이 겹치지 않는다.
  • 모든 회의의 시작 시간과 끝나는 시간은 231 − 1보다 작거나 같은 자연수 또는 0이다.
  • 모든 회의의 시작 시간과 끝나는 시간은 서로 다르다.
  • 회의 인원은 1,000보다 작거나 같은 자연수 이다.

예제 입력 1

6
10 40 80
30 60 60
50 80 70
70 100 100
90 120 40
110 140 50

예제 출력 1

230

코드

/*
    회의실 배정 3
    DP
    dp[i] : i번째 회의까지 진행했을 때의 최대 인원
*/
import java.io.*;
import java.util.*;
public class p19622 {
    static class Meeting {
        int s, e, total;
        public Meeting(int s, int e, int total) {
            this.s = s;
            this.e = e;
            this.total = total;
        }
    }
    static int n;
    static Meeting[] meet;
    static int[] dp;
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;
        n = Integer.parseInt(br.readLine());
        meet = new Meeting[n];
        for (int i = 0; i < n; i++) {
            st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            int total = Integer.parseInt(st.nextToken());

            meet[i] = new Meeting(start, end, total);
        }
        dp = new int[n];

        int answer = -123456789;
        dp[0] = meet[0].total;
        if (n >= 1) {
            answer = dp[0];
        }
        if (n >= 2) {
            dp[1] = meet[1].total;
        }


        for (int i = 2; i < n; i++) {
            // i번째에서의 최대인원은 i번째 회의실 총원 + 그 전까지 회의를 진행한 인원 수
            dp[i] = meet[i].total + answer;
            answer = Math.max(answer, dp[i - 1]);
        }
        answer = Math.max(answer, dp[n - 1]);
        System.out.println(answer);
    }

}
반응형

'알고리즘 > [ Baekjoon ]' 카테고리의 다른 글

[ BOJ ][JAVA][11170] 0의 개수  (0) 2021.05.24
[ BOJ ][JAVA][3187] 양치기 꿍  (0) 2021.05.24
[ BOJ ][JAVA][10775] 공항  (0) 2021.05.20
[ BOJ ][JAVA][7682] 틱택토  (0) 2021.05.20
[ BOJ ][JAVA][3184] 양  (0) 2021.05.20