1931

qkrrnjswo·2023년 4월 13일
0

백준, 프로그래머스

목록 보기
20/53

문제1931. 회의실 배정

한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다.
각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자.
단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다.
이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
start = 회의가 시작하는 시간
end = 회의가 끝나는 시간

  1. start만 정렬해서 풀려고 했으나 이렇게 할 경우 end의 시간에 따라서 조건의 맞는 start를 찾아야 했기 때문에 틀렸다.

  2. dp를 만들어서 풀려고 했었지만 start와 end의 범위가 (0 <= n <= 2^31-1)이기 때문에 너무 많은 자원이 낭비된다.

  3. end를 정렬하고 같다면, start로 정렬해서 그리디 알고리즘을 적용해서 풀었다.

		int[][] rule = new int[n][2];

        for (int i = 0; i < n; i++) {
            rule[i][0] = sc.nextInt();
            rule[i][1] = sc.nextInt();
        }

        Arrays.sort(rule, (o1, o2) -> o1[1]!=o2[1] ? o1[1]-o2[1] : o1[0]-o2[0]);

        int end = rule[0][1];
        int count = 1;
        for (int i = 1; i < rule.length; i++) {
            if (rule[i][0] >= end) {
                count++;
                end = rule[i][1];
            }
        }

0개의 댓글