티스토리 뷰
https://www.acmicpc.net/problem/1379
1379번: 강의실 2
첫째 줄에 강의의 개수 N(1 ≤ N ≤ 100,000)이 주어진다. 둘째 줄부터 N개의 줄에 걸쳐 각 줄마다 세 개의 정수가 주어지는데, 순서대로 강의 번호, 강의 시작 시간, 강의 종료 시간을 의미한다. 강의
www.acmicpc.net
문제
N개의 강의가 있다. 우리는 모든 강의의 시작하는 시간과 끝나는 시간을 알고 있다. 이때, 우리는 최대한 적은 수의 강의실을 사용하여 모든 강의가 이루어지게 하고 싶다.
물론, 한 강의실에서는 동시에 2개 이상의 강의를 진행할 수 없고, 한 강의의 종료시간과 다른 강의의 시작시간이 겹치는 것은 상관없다. 필요한 최소 강의실 수 K와, 각 강의마다 강의실을 배정하는 프로그램을 작성하시오.
유형 : 그리디 + 정렬
접근 방식
- 기존 강의실 문제에서 각 수업이 배정되는 강의실의 번호를 추가 출력하는 문제이다.
- 문제 조건에 의하면 가장 적은 수의 강의실 개수를 사용해야 한다. 즉 수업을 뒤에 붙힐 수 있는 만큼 붙혀야 한다는 것이다.
- 정렬 조건
- 강의의 시작 시간이 작은 순 -> 빨리 시작하는 것부터 채워야 한다.
- 강의가 끝나는 시간이 작은 순 -> 뒤에 오는 수업을 이어 붙힐 수 있다면 붙혀야 한다.
- 강의실
- 끝나는 순이 빠른 (오름차순) 순으로 끝나는 시간만 저장
- 동작
- 위 순으로 정렬된 우선 순위 큐에서 가장 처음의 강의를 확인한다.
- 강의실 큐가 비어 있는 경우
- 첫번째 강의실 배정
- 가장 빨리 끝나는 강의 (우선순위 큐의 peek)
- 다음 강의가 더 늦게 시작하는 경우 -> 이어붙힌다. (기존 강의실 배정)
- 더 빨리 시작하는 경우 -> 새로운 강의실 배정
- 강의실 큐가 비어 있는 경우
- 위 순으로 정렬된 우선 순위 큐에서 가장 처음의 강의를 확인한다.
전체 코드
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
static int n = 0;
public static void main(String[] args) throws Exception {
StringBuilder sb = new StringBuilder();
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
n = Integer.parseInt(st.nextToken());
int[] result = new int[n+1];
PriorityQueue<Node> pq = new PriorityQueue<>(
(x,y) -> {
if(x.s == y.s)
return x.e - y.e;
return x.s - y.s;
}
);
for(int i=1;i<=n;i++){
st = new StringTokenizer(br.readLine());
int num = Integer.parseInt(st.nextToken());
int s = Integer.parseInt(st.nextToken());
int e = Integer.parseInt(st.nextToken());
pq.add(new Node(num,s,e));
}
PriorityQueue<Room> room = new PriorityQueue<>(
(x,y) -> x.e - y.e
);
while(!pq.isEmpty()){
Node cur = pq.poll();
if(room.isEmpty()){
room.add(new Room(1,cur.e));
result[cur.num] = 1;
}else{
if(room.peek().e <= cur.s){
result[cur.num] = room.peek().num;
room.poll();
room.add(new Room(result[cur.num],cur.e));
}else{
result[cur.num] = room.size() + 1;
room.add(new Room(result[cur.num],cur.e));
}
}
}
sb.append(room.size()+"\n");
for(int i=1;i<=n;i++){
sb.append(result[i]+"\n");
}
System.out.print(sb);
br.close();
}
}
class Room{
int num;
int e;
Room(int num,int e){
this.num = num;
this.e = e;
}
}
class Node{
int num;
int s;
int e;
Node(int num,int s,int e){
this.num = num;
this.s = s;
this.e = e;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 3987 (보이저 1호) - java (1) | 2023.11.27 |
---|---|
백준 17404 (RGB 거리 2) - java (1) | 2023.11.22 |
백준 16469 (소년 점프) - java (1) | 2023.11.21 |
백준 18223 (민준이와 마산 그리고 건우) - java (1) | 2023.11.21 |
백준 11952 (좀비) - java (1) | 2023.11.20 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
링크
TAG
- 백준 #다리 만들기 #2146
- 백준 #13549 #숨바꼭질3
- 백준 #2580 #스도쿠
- 17218
- 백준 #1987 #알파벳 #자바 #java
- 백준 #치즈 #2638
- 백준 #4963 #섬의 개수
- 자바 #JAVA
- 백준 #
- 백준 #1727 #커플 만들기 #자바 #java
- 백준 #16973 #직사각형 탈출
- 백준 #15686 #치킨 배달
- 자바
- 백준 #1759 #암호 만들기
- 백준 #인구 이동 #16234
- 백준 #12014 #주식 #자바 #java
- 백준 #1325 #효율적인 해킹
- 백준 #14863 #서울에서 경산까지 #java #자바
- 백준 #25603 #짱해커 이동식 #java #자바
- 백준 #5721 #사탕 줍기 대회 #java #자바
- 백준
- 백준 #1584 #게임 #java #자바
- 백준 #25195 #yes or yes #java #자바
- Java
- 백준 #18405 #경쟁적 전염
- 17394
- 백준 #28140 #빨강~ 빨강~ 파랑! 파랑! 달콤한 솜사탕! #java #자바
- 백준 #3980 #선발 명단
- 백준 #2636 #치즈
- 백준 #17940 #주식 #자바 #java
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
글 보관함