https://www.acmicpc.net/problem/1931
들어가며
이 문제는 테스트 케이스를 잘보면 쉽게 실마리를 잡을 수 있다.
코드
package solved.ac.class3;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.Comparator;
public class 백준1931_회의실배정 {
public static void main(String[] args) throws IOException {
BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
int n = Integer.parseInt(reader.readLine());
Meeting[] meetings = new Meeting[n];
for (int i = 0; i < n; i++) {
int[] inputs = Arrays.stream(reader.readLine().split(" "))
.mapToInt(Integer::parseInt)
.toArray();
Meeting meeting = new Meeting(inputs[0], inputs[1]);
meetings[i] = meeting;
}
Arrays.sort(meetings, Comparator.comparingInt((Meeting m) -> m.end)
.thenComparingInt(m -> m.start));
int count = 0;
int lastEndTime = 0;
for (Meeting meeting : meetings) {
if (meeting.start >= lastEndTime) {
count++;
lastEndTime = meeting.end;
}
}
System.out.println(count);
}
static class Meeting {
int start;
int end;
public Meeting(int start, int end) {
this.start = start;
this.end = end;
}
}
}
풀이
먼저 테스트 코드를 잘 보자.
오른쪽 값들은 회의가 끝나는 시간이다.
오름차순으로 정렬이 되어 있다.
그러면 이 상태에서 만들어진 배열에서 회의 일정을 어떻게 잡을 수 있을까?
(1,4),(5,7),(8,11),(12,14) 로 진행된다.
1 4
5 7
3 8
3 5
2 13
5 9
0 6
8 11
8 12
6 10
12 14
위 값을 입력받는다고 할 땐 어떻게 접근해야 할까??
정답은 여기서 유추를 할 수 있다.
끝나는 시간으로 정렬을 하게 되면 자연스럽게 답을 구할 수 있게 된다.
왜냐하면 최대 개수를 구한다는 말은 최대한 일정을 많이 잡아야 한다.
그러면 중간에 텀이 생기면 안되고, 이 때문에 끝나는 시간으로 정렬하고 계산하면 된다.
'Algorithm > 백준' 카테고리의 다른 글
[백준]11659- 구간 합 구하기 4 문제 풀이(Java,자바) (0) | 2025.02.05 |
---|---|
[백준]14940- 쉬운 최단거리 문제 풀이(Java,자바) (0) | 2025.02.04 |
[백준]1074 - Z 문제 풀이(Java,자바) (0) | 2025.01.27 |
[백준]2805 - 나무 자르기 문제 풀이(Java,자바) (1) | 2025.01.26 |
[백준]11047 - 동전 0 문제 풀이(Java,자바) (1) | 2025.01.26 |