# BOJ01931 회의실 배정

https://www.acmicpc.net/problem/1931 (opens new window)

한 개의 회의실이 있고 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만드려고 한다. 각 회의에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아야 한다.

회의는 한번 시작하면 중간에 중단될 수 없다. 한 회의가 끝나면 동시에 다음 회의가 시작될 수 있다.

회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.

# 정렬

끝나는 시간을 기준으로 우선 오름차순 정렬해야 한다. 최대한 많은 시간을 회의에 참여해야 하려면 끝나는 시간이 중요하기 때문이다. 최대한 작은 수의 시간 부터 회의를 진행해야 한다.

그 다음 시작 시간을 고려하여 정렬한다.

 Arrays.sort(conferences, (o1, o2) -> {
    if (o1[1] < o2[1]) {
        return -1;
    } else if (o1[1] == o2[1] && o1[0] < o2[0]) {
        return -1;
    } else if (o1[1] == o2[1] && o1[0] == o2[0]) {
        return 0;
    }
    return 1;
});

# 제출 코드

아래는 위에서 작성한 정렬을 기반으로 최종 제출 코드이다.

import java.util.Arrays;
import java.util.Scanner;

public class BOJ1931 {

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt(); // 회의의 수
        int[][] conferences = new int[n][2];

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

        Arrays.sort(conferences, (o1, o2) -> {
            if (o1[1] < o2[1]) {
                return -1;
            } else if (o1[1] == o2[1] && o1[0] < o2[0]) {
                return -1;
            } else if (o1[1] == o2[1] && o1[0] == o2[0]) {
                return 0;
            }
            return 1;
        });

        int count = 1;
        int tempEndTime = conferences[0][1];
        for (int i = 1; i < n; i++) {
            if (tempEndTime <= conferences[i][0]) {
                count++;
                tempEndTime = conferences[i][1];
            }
        }

        System.out.println(count);
    }
}
#algorithm #BOJ #그리디 알고리즘 #정렬
last updated: 10/10/2021, 6:09:25 PM