일단 오는 시간 순서대로 정렬을 한다.
앞의 문제와는 다르게 참석해있는 친구를 계속 유지시켜주어야한다.
따라서 각 시간마다 상태 값(state)을 두어서 처리를 한다.
오는 시간과 떠나는 시간이 겹치게 되면 떠나는 것 먼저 처리를 해준다.
상태 값이 's' 이면 오는 것 'e' 이면 떠나는 것으로 구분하여 각 스텝마다 최대 인원을 계산한다.
import java.util.*;
class Time implements Comparable<Time> {
public int time;
public char state;
Time(int time, char state) {
this.time = time;
this.state = state;
}
@Override
public int compareTo(Time ob) {
//시간이 같으면 상황(e or s)에서 정렬 -> e먼저 출력
if(this.time==ob.time) return this.state-ob.state;
//같지 않으면 시간으로만 정렬
else return this.time-ob.time;
}
}
class Main {
public int solution(ArrayList<Time> arr){
int answer = Integer.MIN_VALUE;
Collections.sort(arr);
//현재 존재하는 사람 수
int cnt = 0;
for(Time ob : arr) {
if(ob.state=='s') cnt++;
else cnt--;
//피로연장에 동시에 존재하는 최대 인원을 구하는 것임
answer = Math.max(answer ,cnt);
}
return answer;
}
public static void main(String[] args) {
Main T = new Main();
Scanner kb = new Scanner(System.in);
int n = kb.nextInt();
ArrayList<Time> arr = new ArrayList<>();
for(int i = 0; i < n; i++) {
int sT = kb.nextInt();
int eT = kb.nextInt();
arr.add(new Time(sT, 's'));
arr.add(new Time(eT, 'e'));
}
System.out.println(T.solution(arr));
}
}
'Algorithm > inflearn' 카테고리의 다른 글
다익스트라 알고리즘 (0) | 2021.10.08 |
---|---|
★최대수입스케쥴(PriorityQueue) (0) | 2021.10.08 |
회의실 배정 (0) | 2021.10.07 |
#씨름 선수(Greedy) (0) | 2021.10.07 |
피자 배달거리(DFS 활용) (0) | 2021.10.06 |