-
[백준-1931]-[그리디알고리즘]-회의실배정알고리즘/그리디알고리즘(Greedy Algorithm) 2018. 11. 15. 17:09
문제링크 : https://www.acmicpc.net/problem/1931
이문제를 풀때 가장 햇갈리는 부분은 시작시간과 종료시간의 기준이라고 생각한다.
시작시간으로만 배정 하게 되면 아래와 같은 제약 사항이 발생한다.
1
2
3
4
5
6
7
8
9
시작시간을 기준으로 시작시간이 2인 회의를 배정 하게되면 하나의 회의만 가능하다.
또 회의시간이 짧은것으로 배정을 하게 되면 아래와 같은 제약 사항이 발생한다.
1
2
3
4
5
6
7
8
9
회의시간이 짧은것으로만 배정을 하게 되면 또다시 하나만 선택 되게 된다.
이렇게 반례가 나오게 되면 그리디 알고리즘을 풀 수가 없다.
이 문제를 푸는 방법은 종료시간을 오름차순으로 정렬하게 되면 쉽게 풀수가 있다.
11 1 4 3 5 0 6 5 7 3 8 5 9 6 10 8 11 8 12 2 13 12 14
예제 입력을 보게 되면 끝나는 시간의 오름차순으로 나와 있는걸 알 수 가 있다.
아마 이문제를 푸는 방식을 이해할 수 있게 의도적으로 예제 입력을 저렇게 제공해준거 같다.
추가로 회의시간의 정렬을 끝나는 시간의 오름차순 , 끝나는 시간이 같다면 시작하는 시간의 오름차순으로 정렬하면 된다.
입력된 회의 시간을 모두 정렬을 했다 치고 배열의 0번째 인덱스에서 차례대로 조건에 해당되는 회의의 수를 파악하면 끝난다.
조건 : 이전 회의의 끝나는 시간과 현재 회의의 시작 시간이 같거나 커야 한다.
소스
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374import java.io.BufferedReader;import java.io.IOException;import java.io.InputStreamReader;import java.util.ArrayList;import java.util.Collections;import java.util.StringTokenizer;public class B_1931 {public static void main(String[] args) throws IOException {BufferedReader br = new BufferedReader(new InputStreamReader(System.in));StringTokenizer st = new StringTokenizer(br.readLine());int cnt = Integer.parseInt(st.nextToken());ArrayList<Time> timeList = new ArrayList<Time>();for(int i=0; i < cnt; i++) {st = new StringTokenizer(br.readLine());int start = Integer.parseInt(st.nextToken());int end = Integer.parseInt(st.nextToken());timeList.add(new Time(start, end));}Collections.sort(timeList);int result = 0;int prevEnd = 0;for(Time t:timeList) {if(prevEnd <= t.getStart()) {result += 1;prevEnd = t.getEnd();}}System.out.println(result);}}class Time implements Comparable<Time>{private int start;private int end;public Time(int start, int end) {this.start = start;this.end = end;}public int getStart() {return this.start;}public int getEnd() {return this.end;}@Overridepublic int compareTo(Time t) {if(this.end < t.getEnd()) {return -1;}else if(this.end == t.getEnd()) {if(this.start < t.getStart()) {return -1;}else if(this.start == t.getStart()) {return 0;}else {return 1;}}else {return 1;}}public String toString() {return "start : " + this.start + " end : " + this.end;}}cs '알고리즘 > 그리디알고리즘(Greedy Algorithm)' 카테고리의 다른 글
[백준 5585] - [그리디알고리즘] - 거스름돈 (JAVA) (0) 2018.12.27 [백준-4307]-[그리디알고리즘]-개미 (0) 2018.11.15 [백준-2217]-[그리디알고리즘]-로프 (0) 2018.11.15 [백준-11399]-[그리디알고리즘]-ATM (0) 2018.11.15 [백준-11047]-[그리디알고리즘]-동전 0 (0) 2018.11.15 댓글