일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 | 31 |
- Proxy Server
- 플로이드 와샬
- 호스팅이란?
- SSAFY
- 최단 경로
- floyd-warshall
- 싸피 합격
- 플로이드 워셜
- 프록시서버
- 호스팅
- 뮤텍스
- Dijkstra Algorithm
- 싸피 면접 후기
- 다익스트라
- 삼성 청년 SW 아카데미
- 세마포어와 뮤텍스의 차이
- 싸피
- Synchronization
- 프록시
- 뮤텍스란?
- 세마포어
- 세마포어란?
- 웹 호스팅
- 동기화
- 다익스트라 알고리즘
- 클라우드 서버
- 세마포어와 뮤텍스
- 서버 호스팅
- Proxy
- Today
- Total
어제의 나보다 성장한 오늘의 나
[백준][BOJ-11000][JAVA] 강의실 배정 본문
https://www.acmicpc.net/problem/11000
import java.io.*;
import java.util.*;
public class Main {
final static int MAX_VALUE = 200001;
static int[] parents = new int[MAX_VALUE];
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
StringTokenizer st;
List<Time> list = new ArrayList<>();
for(int i=0; i<N; i++) {
st = new StringTokenizer(br.readLine());
int a = Integer.parseInt(st.nextToken());
int b = Integer.parseInt(st.nextToken());
list.add(new Time(a,b));
}
Collections.sort(list, (a,b) -> a.start - b.start);
PriorityQueue<Time> pq = new PriorityQueue<>((a,b) -> a.end - b.end);
pq.add(list.get(0));
for(int i=1; i<list.size(); i++) {
Time t = list.get(i);
if(t.start >= pq.peek().end) {
pq.poll();
}
pq.add(t);
}
System.out.println(pq.size());
}
}
class Time{
int start;
int end;
public Time(int start, int end) {
super();
this.start = start;
this.end = end;
}
}
정리
일단 회의실 배정은 시작이 빠른 순서대로 먼저 진행되어야 한다. 따라서 List에 저장되어 있는 값을 시작 시간 오름차순으로 정렬 주었다.
그리고 그에 따라 적게 사용하기 위해선 종료시간과 다음 회의 시작시간 사이의 텀이 아주 적어야 한다.
그래서 시작 시간을 정렬한 list와 종료시간을 비교할 수 있는 우선순위 큐를 선언해준다.
예시로 한 번 이해해 보도록 하자!
arr[0] = 0 6
arr[1] = 1 4
arr[2] = 2 5
arr[3] = 3 7
arr[4] = 4 8
arr[5] = 5 10
결과부터 말하자면 우선순위 큐의 사이즈가 결국 배정받은 강의실이 된다.
위와 같은 예시에서 먼저 arr[0]번째는 무조건 강의실 배정받아야 하므로 우선순위 큐에 넣어준다. ( 강의실 1 )
그리고 arr[1]의 시작 시간은 1이고 우선순위 큐 맨 위의 종료 시간(가장 빨리 끝나는 강의실 시간)은 6이다. 그러면 아직 회의가 끝난 게 아니므로 강의실을 배정받아야 한다. 따라서 우선순위 큐에 넣어준다. ( 강의실 2 )
arr[2]도 시작시간은 2인데 arr[1]의 값이 들어갔기 때문에 종료시간은 4이다. 근데 아직 회의가 끝난 게 아니므로 강의실 배정을 받아야 한다. ( 강의실 3 ) 따라서 우선순위큐에 넣어준다. arr[3]도 똑같다. ( 강의실 4 )
arr[4]는 시작시간이 4이고 가장 빨리 끝나는 강의실 시간이 4이다. 그러므로 이어서 진행하면 되니깐 강의실을 비워준다 즉! 우선순위 큐에서 제거해준다. 그리고 arr[4]의 값을 넣어준다. ( 강의실이 비워도 그 강의실에 다시 들어가기 때문에 ) ( 강의실 4 )
정리하면 끝에 우선순위 큐의 사이즈가 결국 배정받은 강의실이 된다. 아래의 예시 같은 경우 계속 우선순위 사이즈가 1을 유지 하기에 강의실은 1개만 필요!
arr[0] = 0 1
arr[1] = 1 2
arr[2] = 2 3
'알고리즘 > 백준(BOJ)' 카테고리의 다른 글
[백준][BOJ-1238][JAVA] 파티 (0) | 2021.06.04 |
---|---|
[백준][BOJ-8980][JAVA] 택배 (0) | 2021.06.03 |
[백준][BOJ-13549][JAVA] 숨바꼭질 3 (0) | 2021.06.01 |
[백준][BOJ-16398][JAVA] 행성 연결 (0) | 2021.05.31 |
[백준][13458][Java] 시험 감독 (0) | 2021.05.25 |