백준 1931. 회의실 배정하기

WooHyeong·2024년 1월 2일
0

Algorithm

목록 보기
34/41

백준1931. 회의실 배정하기

문제

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

입력

첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 2^31-1보다 작거나 같은 자연수 또는 0이다.

출력

첫째 줄에 최대 사용할 수 있는 회의의 최대 개수를 출력한다.

풀이

이전에 풀었는데 까먹었고 몇달 전 다시 풀면서 고민을 했지만 이제 와서 제대로 풀고 글을 작성한다.

우선 당연히 입력된 회의들로 가능한 경우의 수를 모두 만들어본다면 tle가 날 것이다.

아마 처음 풀 때는 풀이를 생각했을 것이다.
최대한 많은 회의를 진행해야한다. 어떻게 해야할까
정해진 시간 동안 많은 회의를 진행하기 위해서는 종료시간이 빨라야 한다.

종료 시간이 빠르면 더 많은 회의 시간을 선택할 수 있다는 것에 포인트를 맞추면 종료 시간을 기준으로 정렬을 하면 된다는 것을 알 수 있다.

종료시간이 가장 빠른 것부터 겹치지 않는 다음 빠른 종료 시간을 가진 회의를 찾아가면 최대 회의의 수를 구할 수 있다.

이번에 다시 풀면서 풀이가 생각나지 않아 답안을 보았는데 이해가 가지 않았다. 시작 지점 정렬을 하고 푸는 줄 알았기 때문이다.
정렬은 종료 시점을 기준으로 한다. 명심

풀이 코드 java

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
import java.util.StringTokenizer;

// 백준 1931. 회의실 배정
public class boj1931 {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int n = Integer.parseInt(br.readLine());

        int[][] rooms = new int[n][2];
        for (int i = 0; i < n; i++) {
            StringTokenizer stk = new StringTokenizer(br.readLine());
            rooms[i][0] = Integer.parseInt(stk.nextToken());
            rooms[i][1] = Integer.parseInt(stk.nextToken());
        }

        Arrays.sort(rooms, new Comparator<int[]>() {
            @Override
            public int compare(int[] o1, int[] o2) {
                if (o1[1] == o2[1]) {
                    return o1[0] - o2[0];
                }
                return o1[1] - o2[1];
            }
        });

        int answer = 0;
        int end = -1;

        for (int i = 0; i < n; i++) {
            if (rooms[i][0] >= end){
                end = rooms[i][1];
                answer++;
            }
        }

        System.out.println(answer);

    }

}
profile
화이링~!

0개의 댓글