Algorithm

백준 1931번: 회의실 배정

10Biliion 2025. 2. 24. 19:11

풀이코드

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));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        int N = Integer.parseInt(br.readLine());

        int[][] time = new int[N][2];

        StringTokenizer st;

        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine(), " ");
            time[i][0] = Integer.parseInt(st.nextToken());
            time[i][1] = Integer.parseInt(st.nextToken());
        }

        // 끝나는 시간을 기준으로 오름차순 정렬
        // 만약 종료 시간이 같으면, 시작 시간을 기준으로 오름차순 정렬
        Arrays.sort(time, (o1, o2) -> {
            return o1[1] == o2[1] ? o1[0] - o2[0] : o1[1] - o2[1];
        });

        int end = 0;
        int count = 0;

        // 각 회의에 대해서, 끝나는 시간이 이전 회의의 끝나는 시간보다 크거나 같으면 선택
        for (int i = 0; i < N; i++) {
            if (end <= time[i][0]) {
                end = time[i][1];
                count++;
            }
        }

        bw.write(String.valueOf(count));
        bw.close();
        br.close();
    }
}

 

 

 

회의 시간 정렬

주된 정렬 기준은 끝나는 시간이고, 끝나는 시간이 같으면 시작 시간을 기준으로 정렬합니다. 이렇게 정렬된 배열에서 가장 빨리 끝나는 회의를 먼저 선택할 수 있도록 합니다.

Arrays.sort(time, (o1, o2) -> {
    return o1[1] == o2[1] ? o1[0] - o2[0] : o1[1] - o2[1];
});

 

그리디 알고리즘을 이용한 회의 배정

end는 이전 회의가 끝나는 시간을 추적하는 변수입니다. 각 회의를 살펴보면서 end보다 시작 시간이 늦거나 같으면 해당 회의를 배정하고, end를 그 회의의 종료 시간으로 갱신합니다.

int end = 0;
int count = 0;
for (int i = 0; i < N; i++) {
    if (end <= time[i][0]) {  // 끝나는 시간보다 시작 시간이 빠르면 회의 배정 가능
        end = time[i][1];  // 끝나는 시간을 갱신
        count++;  // 회의 배정 개수 증가
    }
}

 

 

시간 복잡도

Arrays.sort()는 O(N log N)의 시간 복잡도를 가집니다.

'Algorithm' 카테고리의 다른 글

백준 1260번: 신입사원  (1) 2025.03.06
백준 1260번: 카드 정렬하기  (0) 2025.03.06
트리 정렬(Tree Sort)  (0) 2025.02.19
퀵 정렬(Quick Sort)  (0) 2025.02.19
힙 정렬(Heap Sort)  (0) 2025.02.19