티스토리 뷰

algorithm/problem solving

BOJ 1931 회의실배정

무니웜테일패드풋프롱스 2020. 4. 14. 15:27

 

 

1931번: 회의실배정

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

www.acmicpc.net

단순한 그리디 알고리즘으로 풀린다. 

회의시간이 주어졌을 때

1)끝나는 시간이 가장 빠른 회의를 먼저 선택

2)해당 회의시간과 겹치지 않는 회의가 나오면 그 회의를 또 선택

.. 이렇게 반복해서 회의 선택할 때마다 +1 을 해주면 최대로 진행할 수 있는 회의 수가 된다.

 

하지만 해당 문제에서 주어지는 회의시간이 끝나는 시간 대로 정렬되지 않았기 때문에 먼저 끝나는 시간 별로 들어온 회의 정보를 정렬해준다. 

그렇다고 끝나는 시간별로만 정렬을 해주면 틀린다. 왜냐하면

8시 시작 8시 끝 5시 시작 8시 끝 이렇게 주어진 회의의 경우, 정렬하였을 때도 8-8 5-8 이렇게 정렬되기 때문에

8-8 회의를 진행하고 5-8을 진행할 수 없다고 판단하게 된다. (왜냐하면 첫번째 회의의 끝나는 시간 8 보다 두번째 회의의 시작하는 시간 5 이 더 작기때문이다. ) 하지만 실제로는 5-8 8-8 이런식으로 두 회의를 진행할 수 있다.

 

따라서 , 정렬조건을 넣어준다.

두 요소의 끝나는 시간이 같은 경우에는, 시작하는 시간대로 정렬을 해주어야한다.

 

아래는 전체 자바소스이다.

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

class pair implements Comparable<pair>{
	pair(int start, int end){
		this.start=start;
		this.end=end;
	}
	pair(){}
	
	
	int start;
	int end;
	@Override 
	// 끝나는 시간 (end)으로 오름차순 정렬, 끝나는 시간이 같다면 시작시간 (start)로 정렬해주어야 한다.
	public int compareTo(pair arg) {
		if(this.end < arg.end ) return -1;
		else if(this.end>arg.end ) return 1;
		else if (this.end == arg.end) {
			if(this.start < arg.start) return -1;
			else if(this.start > arg.start) return 1;
		}
		return 0;
	}
}

public class Main {	
	static pair[] info; 
	static int maxnum=1;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer stk = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(stk.nextToken());
		info = new pair[n]; 
		for(int i=0;i<n; i++) {
			stk = new StringTokenizer(br.readLine());
			int start = Integer.parseInt(stk.nextToken());
			int end = Integer.parseInt(stk.nextToken());
			info[i]=new pair(start,end); 
		}
		
		Arrays.parallelSort(info); // 소팅 (끝나는 시간 별로 ) 
		solve(n);
		System.out.println(maxnum);
	}
	
	private static void solve(int n) {
		pair now = info[0]; //가장 빨리 끝나는 회의 먼저 저장 
		for(int i=1; i<n; i++) { 
			if(info[i].start >= now.end){ //다음 회의의 시작시간이 현재 하고 있는 회의의 끝나는 시간과 같거나 
				                          //넘어가는 경우 새로운 회의 시작 
				now = info[i];
				maxnum++;
			}
		}
		
	}
}

'algorithm > problem solving' 카테고리의 다른 글

BOJ 2579 계단 오르기  (0) 2020.04.15
BOJ 2156 포도주 시식  (0) 2020.04.14
BOJ 11657 타임머신  (0) 2020.04.14
BOJ 2667 단지번호붙이기  (0) 2020.04.08
BOJ 1260 DFS와 BFS  (0) 2020.04.05
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
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
글 보관함