문제
회의실 배정
유명한 웰노운 그리디 알고리즘 문제입니다.
풀이
먼저 회의를 시작 시간 기준으로, 시작 시간이 같으면 끝나는 시간을 기준으로 오름차순 정렬합니다. 정렬 기준으로
마지막으로 배치된 회의의 끝나는 시간을
코드
Python
from dataclasses import dataclass
@dataclass
class Meeting:
start: int
end: int
n = int(input())
meetings = [Meeting(*map(int, input().split())) for _ in range(n)]
meetings.sort(key=lambda x: (x.start, x.end))
answer = 0
last_end = -1
for meeting in meetings:
if last_end <= meeting.start:
answer += 1
last_end = meeting.end
else:
last_end = min(last_end, meeting.end)
print(answer)C++
#include <bits/stdc++.h>
using namespace std;
struct Meeting {
int start, end;
auto operator<=>(const Meeting& m) const = default;
};
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int n;
cin >> n;
vector<Meeting> meetings(n);
for (auto& [start, end] : meetings)
cin >> start >> end;
ranges::sort(meetings);
int answer = 0;
int lastEnd = -1;
for (auto [start, end] : meetings) {
if (lastEnd <= start) {
answer++;
lastEnd = end;
} else
lastEnd = min(lastEnd, end);
}
cout << answer;
return 0;
}Java
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.Arrays;
import java.util.StringTokenizer;
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());
Meeting meetings[] = new Meeting[n];
for (int i = 0; i < n; i++) {
StringTokenizer tk = new StringTokenizer(br.readLine());
int start = Integer.parseInt(tk.nextToken()), end = Integer.parseInt(tk.nextToken());
meetings[i] = new Meeting(start, end);
}
Arrays.sort(meetings);
int answer = 0;
int lastEnd = -1;
for (Meeting m : meetings) {
if (lastEnd <= m.start) {
answer++;
lastEnd = m.end;
} else
lastEnd = Math.min(lastEnd, m.end);
}
bw.write(answer + "");
bw.close();
}
}
class Meeting implements Comparable<Meeting> {
int start, end;
Meeting(int start, int end) {
this.start = start;
this.end = end;
}
@Override
public int compareTo(Meeting m) {
if (start != m.start)
return start - m.start;
return end - m.end;
}
}