본문 바로가기
알고리즘/백준

[Java] 백준1931_회의실배정

by 댕꼬 2022. 4. 8.

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

 

1931번: 회의실 배정

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

www.acmicpc.net

[문제]

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

 

[입력]

11
1 4
3 5
0 6
5 7
3 8
5 9
6 10
8 11
8 12
2 13
12 14

 

[출력]

4

 

[풀이]

그리디 알고리즘의 대표적인 문제이다. 

시작시간보다 종료시간에 초점을 두어 회의실을 배정하였다.종료시간을 기준으로 오름차순 정렬을 하고, 그 다음 배열부터는 종료시간보다 같거나 큰 시작시간을 찾아주었다.여기서 헷갈렸던 것은 회의의 시작시간과 끝나는 시간이 같을 수도 있다라는 조건이였다.현재 종료시간이 3이라고 했을 때, 뒤에 시작-종료시간이 (3,4)인 회의와 (4,4)인 회의가 있다고 가정해보자.(3,4)인 회의를 먼저 배정하면, 바로 뒤에 (4,4)회의를 진행할 수 있지만 반대로 (4,4)회의를 먼저 배정할 경우 (3,4)회의는 진행할 수 없다. 그러므로, 종료시간으로 오름차순정렬을 하되, 종료시간이 같을 경우 시작시간을 기준으로 오름차순을 해야하므로 compareTo 메소드에 삼항연산자를 이용하여 아래와 같이 구현하였다.

 

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

public class BJ1931_회의실배정 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int N = sc.nextInt();

		Meet[] arr = new Meet[N];

		for (int i = 0; i < N; i++) {
			int s=sc.nextInt();
			int e=sc.nextInt();
			arr[i]= new Meet(s,e);
		}
		
		Arrays.sort(arr);
		
		int end=arr[0].end;
		int count=1;
		
		for(int i=1; i<N; i++) {
			if(arr[i].start>=end) {
				count++;
				end=arr[i].end;
			}
		}
		
		System.out.println(count);

	}

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

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

		@Override
		public int compareTo(Meet o) {
			return this.end != o.end ? this.end - o.end : this.start - o.start;
		}

	}

}

'알고리즘 > 백준' 카테고리의 다른 글

[Java] 백준4485_녹색옷입은애가젤다지  (0) 2022.04.07
[Java] 백준2531_회전초밥  (0) 2022.04.06
[Java] 백준16926_배열돌리기 1  (0) 2022.04.02
[Java] 백준1463_1로만들기  (0) 2022.03.31
[Java]백준1149_RGB거리  (0) 2022.03.31

댓글