문제링크 🚩
https://www.acmicpc.net/problem/1931
📕 문제 접근 📕
- 시작 시간과 끝 시간을 하나의 리스트로 관리하기 위해 Time이라는 클래스를 정의한다
- 종료 시간을 기준으로 정렬을 한다. 종료 시간이 같다면 시작시간이 짧은걸 우선으로 배치한다.
- 종료 시간이 빨라야 더 많은 회의를 진행 할 수 있기 때문.
💻 Code 💻
package BOJ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.StringTokenizer;
public class BOJ_1931_회의실배정 {
public static class Time {
int start;
int end;
public Time(int start, int end) {
this.start = start;
this.end = end;
}
}
public static class TimeComparator implements Comparator<Time> {
@Override
public int compare(Time t1, Time t2) {
// 종료 시간이 같으면 시작 시간이 빠른 순으로 정렬
if (t1.end == t2.end) {
return Integer.compare(t1.start, t2.start);
}
return Integer.compare(t1.end, t2.end);
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
int TC = Integer.parseInt(br.readLine());
ArrayList<Time> meetings = new ArrayList<>();
// 회의 입력 받기
for (int i = 0; i < TC; i++) {
st = new StringTokenizer(br.readLine());
int start = Integer.parseInt(st.nextToken());
int end = Integer.parseInt(st.nextToken());
meetings.add(new Time(start, end));
}
// 회의 시간을 끝나는 시간을 기준으로 정렬
Collections.sort(meetings, new TimeComparator());
int endTime = 0; // 현재 선택된 회의의 끝나는 시간
int count = 0; // 선택한 회의의 수
// 정렬한 뒤 현재 미팅 시작시간이 마감 시간보다 크면 플러스 -> 정렬을 해뒀기 때문에 그리디한 접근이 가능함
for (Time meeting : meetings) {
if (meeting.start >= endTime) {
endTime = meeting.end;
count++;
}
}
System.out.println(count);
}
}
💻 Code Review💻
📖 배운점 📖
- 원하는 시간을 기준으로 정렬을 하기 위해 Comparator를 만드는 것이 생각보다 어려웠다.
- 문제 접근이 쉽더라도 구현하기 위해 Java문법을 더욱 연습해야겠다.
public static class TimeComparator implements Comparator<Time> {
@Override
public int compare(Time t1, Time t2) {
// 종료 시간이 같으면 시작 시간이 빠른 순으로 정렬
if (t1.end == t2.end) {
return Integer.compare(t1.start, t2.start);
}
return Integer.compare(t1.end, t2.end);
}
}
'JAVA > Algo 풀이' 카테고리의 다른 글
[프로그래머스] 키패드 누르기 - 2020 카카오 인턴쉽, 자바 (0) | 2023.11.09 |
---|---|
[프로그래머스] 두 큐 합 같게 만들기 - 2022 KAKAO TECH INTERNSHIP (0) | 2023.11.07 |
[백준] 18870 좌표압축(JAVA) (0) | 2023.08.08 |
[백준 ] 14438 수열과 쿼리 17 - 세그먼트트리(JAVA) (0) | 2023.08.06 |
[백준] 4354 문자열 제곱 - KMP(JAVA) (0) | 2023.08.06 |