-
[BOJ] 회의실 배정알고리즘 2024. 5. 24. 17:17
문제
한 개의 회의실이 있는데 이를 사용하고자 하는 N개의 회의에 대하여 회의실 사용표를 만들려고 한다. 각 회의 I에 대해 시작시간과 끝나는 시간이 주어져 있고,
각 회의가 겹치지 않게 하면서 회의실을 사용할 수 있는 회의의 최대 개수를 찾아보자. 단, 회의는 한번 시작하면 중간에 중단될 수 없으며 한 회의가 끝나는 것과 동시에 다음 회의가 시작될 수 있다.
회의의 시작시간과 끝나는 시간이 같을 수도 있다. 이 경우에는 시작하자마자 끝나는 것으로 생각하면 된다.
풀이
숫자가 너무 난잡하게 나열되어 있어서 우선 정렬을 하기로 하였다.
회의 시작 시간 오름차순, 끝나는시간 오름차순으로 정렬을 하였다.회의실을 배졍하는 기준은 다음고 같이 잡았다.
이전에 배정한 회의 종료 시간이 넣을 회의 시작시간보다 작거나 같으면 회의를 추가할 수 있다.
그러나 이전에 배정한 회의 종료 시간이 넣을 회의 종료 시간보다 크다면 이후의 배정 가능한 회의 시간을
불가능하게 하므로 비효율적인 시간표가 되기 때문에 제거하도록 한다.import java.lang.*; import java.util.*; import java.io.*; public class Main { static int K; static int N; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); List<Info> list = new ArrayList<>(); List<Info> rooms = new ArrayList<>(); int N = Integer.parseInt(br.readLine()); for (int i = 0; i < N; i++) { String[] str = br.readLine().split(" "); list.add(new Info(Integer.parseInt(str[0]), Integer.parseInt(str[1]))); } Collections.sort(list, new Comparator<Info>() { @Override public int compare(Info o1, Info o2) { if (o1.start == o2.start) { return o1.end - o2.end; } return o1.start - o2.start; } }); rooms.add(list.get(0)); for (int i = 1; i < N; i++) { Info info = list.get(i); int size = rooms.size(); Info prev = rooms.get(size - 1); if (prev.end <= info.start) { rooms.add(info); } else if (prev.end > info.end) { rooms.remove(size - 1); rooms.add(info); } } System.out.println(rooms.size()); } static class Info { int start; int end; public Info(int start, int end) { this.start = start; this.end = end; } } }
https://github.com/Win-9/Algorism/tree/main/BOJ/%ED%9A%8C%EC%9D%98%EC%8B%A4%20%EB%B0%B0%EC%A0%95
728x90'알고리즘' 카테고리의 다른 글
[BOJ] DSLR (0) 2024.06.02 [BOJ] 가장 가까운 세 사람의 심리적 거리 (0) 2024.06.01 [BOJ] 랜선 자르기 (0) 2024.05.24 [프로그래머스] 리코쳇 로봇 (0) 2024.05.18 [프로그래머스] 연속된 부분 수열의 합 (0) 2024.05.14