Algorithm

[BOJ] 19598. 최소 회의실 개수

프로그래민 2021. 5. 7. 01:38
반응형

1931.회의실 배정(링크)과 유사한 그리디 유형의 문제였다.

문제를 마주하였을 때 회의실 배정 문제와 상당히 유사하여 비슷한 방식으로 풀게 되었다. 우선 적으로 모든 회의를 시작 시간 기준으로 우선순위 큐에 넣어 정렬을 하였다. 그 후 현재 가장 빠른 시각에 시작된 회의의 끝나는 시간과 그 바로 다음에 시작하는 회의의 시작 시간을 서로 비교하여, 만일 현재회의 끝시간 > 다음회의 시작시간 이면 회의실을 하나씩 추가하는 방식으로 구현해보았다. 

회의실 배정과 다른점은 회의실 배정은 하나의 회의실이기때문에 회의들을 1.끝나는 시간으로 회의정렬, 2. 현재 회의의 끝시간, 다음 회의의 시작시간 비교 이러한 방식으로 풀었지만, 이 문제는 회의실 자체를 늘리는 문제이기에 1. 시작 시간으로 회의정렬, 2. 현재 회의의 끝시간, 다음 회의의 시작시간 비교 방식으로 풀 수 있었다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package study4;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.StringTokenizer;
 
public class Main_bj_1931_회의실배정 {
    static class Node implements Comparable<Node>{
        int start, end;
        Node(int start,int end){
            this.start=start;this.end=end;
        }
        @Override
        public int compareTo(Node o) {
            if(end==o.end) {
                return Integer.compare(start, o.start);
            }
            return Integer.compare(end, o.end);
        }
    }
 
    static Node[] arr;
    static int N;
    
    public static void main(String[] args) throws Exception {
        BufferedReader br= new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
        N=Integer.parseInt(br.readLine());
        arr=new Node[N];
        for(int i=0;i<N;i++) {
            st=new StringTokenizer(br.readLine());
            int s=Integer.parseInt(st.nextToken());
            int e=Integer.parseInt(st.nextToken());
            arr[i]=new Node(s, e);
        }
        
        Arrays.sort(arr);
        
        
        int count =1;
        int curEnd=arr[0].end;
        
        for(int i=1;i<N;i++) {
            if(arr[i].start>=curEnd) {
                count+=1;
                curEnd=arr[i].end;
            }
        }
        
        System.out.println(count);
    }
    
}
 
                                        

 

하지만 이문제는 이런 방식으로도 풀 수 있지만, 단순하게 시작 시간, 끝 시간을 모두 입력받고 정렬 후 시작 시간을 마주하면 +1, 끝 시간을 마주하면 -1 하는 방식으로도 간단히 풀 수 있다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
package algosutdy1;
 
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;
 
public class Main_bj_19598_최소회의실개수 {
    static class Meeting implements Comparable<Meeting> {
        int time;
        boolean isStart;
 
        public Meeting(int time, boolean isStart) {
            this.time = time;
            this.isStart = isStart;
        }
 
        @Override
        public int compareTo(Meeting o) {
            return Integer.compare(time, o.time);
        }
    }
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = null;
 
        PriorityQueue<Meeting> pq = new PriorityQueue<>();
 
        int N = Integer.parseInt(br.readLine());
 
        for (int i = 0; i < N; i++) {
            st = new StringTokenizer(br.readLine());
            pq.add(new Meeting(Integer.parseInt(st.nextToken()), true));
            pq.add(new Meeting(Integer.parseInt(st.nextToken()), false));
        }
 
        int meetingRoom = 0;
        int answer = 0;
 
        while (!pq.isEmpty()) {
            Meeting cur = pq.poll();
 
            if (cur.isStart) {
                meetingRoom += 1;
                answer = Math.max(answer, meetingRoom);
            } else {
                meetingRoom -= 1;
            }
        }
 
        System.out.println(answer);
    }
}
 
                                            
반응형

'Algorithm' 카테고리의 다른 글

[BOJ] 11053. 가장 긴 증가하는 부분 수열  (0) 2021.05.09
[BOJ] 2352. 반도체 설계  (0) 2021.05.09
[BOJ] 2110. 공유기 설치  (0) 2021.05.05
[BOJ] 1043. 거짓말  (0) 2021.05.04
[Programmers] 가사 검색  (0) 2020.09.15