CS/Algorism

[백준] 1931. 회의실 배정

olsohee 2023. 12. 2. 20:34

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

 

1931번: 회의실 배정

(1,4), (5,7), (8,11), (12,14) 를 이용할 수 있다.

www.acmicpc.net

이번 문제는 그리디 문제로, 회의 종료 시간이 빠른 순서대로 정렬한 뒤 차례대로 회의를 진행하면 된다.

 

그런데 주의할 점은, 만약 회의 종료 시간이 같다면 회의 시작 시간이 빠른 순으로 정렬해야 한다. 예를 들어, 다음과 같이 회의가 있다고 가정하자.

1 ~ 3
4 ~ 8
8 ~ 8

 

만약 회의 시작 시간이 빠른 순으로 정렬하는 것을 고려하지 않고 다음 순서로 진행한다면, 

1 ~ 3
8 ~ 8
4 ~ 8

 

8 ~ 8 회의를 진행한 후 preMeetingEndTime 변수의 값은 8이 되어 4 ~8 회의를 진행할 수 없다. 그러나 회의 시작 시간이 빠른 순으로 정렬한다면, 4 ~ 8 회의를 먼저 진행한 후 preMeetingEndTime 변수의 값이 8이 되고 8 ~8 회의도 진행할 수 있다.

import java.io.BufferedReader;
import java.io.IOException;

import java.io.InputStreamReader;
import java.util.*;

public class Main {

    static int n;
    static List<Meeting> meetingList = new ArrayList<>();

    public static void main(String[] args) throws IOException {

        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        n = Integer.parseInt(br.readLine());
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            int start = Integer.parseInt(st.nextToken());
            int end = Integer.parseInt(st.nextToken());
            meetingList.add(new Meeting(start, end));
        }

        Collections.sort(meetingList);

        int answer = 0;
        int preMeetingEndTime = 0;
        for (int i = 0; i < meetingList.size(); i++) {
            Meeting meeting = meetingList.get(i);
            if (meeting.start >= preMeetingEndTime) {
                answer++;
                preMeetingEndTime = meeting.end;
            }
        }

        System.out.println(answer);
    }

    static class Meeting implements Comparable<Meeting> {
        int start;
        int end;

        public Meeting(int start, int end) {
            this.start = start;
            this.end = end;
        }

        @Override
        public int compareTo(Meeting o) {
            if (this.end == o.end) {
                return this.start - o.start;
            }
            return this.end - o.end;
        }
    }
}

기발하게 그리디 알고리즘을 사용하는 해결법을 떠올리는 것이 아직 익숙하지 않다..! 그리고 문제에 "회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다."라는 설명이 있는데, 이런 부분을 특히 주의하여 반례를 잘 생각해야겠다.

'CS > Algorism' 카테고리의 다른 글

[백준] 11501. 주식  (2) 2023.12.06
[백준] 2457. 공주님의 정원  (2) 2023.12.05
[백준] 14501. 퇴사  (0) 2023.11.30
[백준] 11055. 가장 큰 증가하는 부분 수열  (0) 2023.11.30
[백준] 12825. 1로 만들기 2  (0) 2023.11.28