반응형
문제
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의들에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고, 각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 최대수의 회의를 찾아라. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다. 회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
입력
첫째 줄에 회의의 수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N+1 줄까지 각 회의의 정보가 주어지는데 이것은 공백을 사이에 두고 회의의 시작시간과 끝나는 시간이 주어진다. 시작 시간과 끝나는 시간은 231-1보다 작거나 같은 자연수 또는 0이다.
출력
첫째 줄에 최대 사용할 수 있는 회의 수를 출력하여라.
Java Solution
import java.io.*;
import java.util.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
int n = Integer.parseInt(br.readLine());
Conference[] confs = new Conference[n];
for(int i = 0; i < n; i++) {
StringTokenizer tokenizer = new StringTokenizer(br.readLine());
int start = Integer.parseInt(tokenizer.nextToken());
int end = Integer.parseInt(tokenizer.nextToken());
confs[i] = new Conference(start, end);
}
Arrays.parallelSort(confs);
int lastTime = -1;
int cnt = 0;
for(int i = 0; i < n; i++) {
if(lastTime <= confs[i].start) {
lastTime = confs[i].end;
cnt++;
}
}
bw.write(String.valueOf(cnt));
br.close();
bw.close();
}
private static class Conference implements Comparable<Conference> {
int start;
int end;
Conference(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public int compareTo(Conference o) {
int comp = Integer.compare(end, o.end);
return comp != 0 ? comp : Integer.compare(start, o.start);
}
}
}
Comparable 인터페이스를 구현하여서 1순위로 끝나는 시간을 기준으로, 만약 끝나는 시간이 같다면 시작 시간을 기준으로 오름차순 정렬을 한 후에, 시작 시간이 가장 최근에 끝난 회의 시간 이상일 경우 카운트를 세는 방식으로 풀었습니다.
반응형
'Algorithm' 카테고리의 다른 글
[프로그래머스] 이중우선순위 큐 - Java, Kotlin (0) | 2019.09.26 |
---|---|
[백준 1037번] 약수 - Java (0) | 2019.09.23 |
[백준 2217번] 로프 - Java (0) | 2019.09.21 |
[백준 11399번] ATM - Java (0) | 2019.09.21 |
[백준 11047번] 동전 0 - Java (0) | 2019.09.20 |