[JAVA 문제 풀이] 369. Maximum Number of Events That Can Be Attended II (참석할 수 있는 최대 이벤트 수 II)
Jul 08, 2025
Contents
내가 작성한 코드 + 다른 사람의 코드

events[i] = [startDayi, endDayi, valuei]인 다양한 이벤트가 제공됩니다.
i번째 이벤트는 startDayi에서 시작하여 endDayi에서 종료되며,
이 이벤트에 참석하면 valuei 값을 받게 됩니다.
또한 참석할 수 있는 최대 이벤트 수를 나타내는 정수 k가 주어집니다.
한 번에 하나의 이벤트에만 참석할 수 있습니다.
이벤트에 참석하기로 선택한 경우 전체 이벤트에 참석해야 합니다.
단, 하나는 시작하고 다른 하나는 같은 날 끝나는 두 이벤트에는 참석할 수 없습니다.
행사에 참석하여 받을 수 있는 최대 값의 합계를 반환하세요.
제약 조건:
* 1 <= k <= events.length
* 1 <= k * events.length <= 10^6
* 1 <= startDayi <= endDayi <= 10^9
* 1 <= valuei <= 10^6
내가 작성한 코드 + 다른 사람의 코드
import java.util.*;
class Solution {
public int maxValue(int[][] events, int k) {
int n = events.length;
// 종료일 기준 정렬
Arrays.sort(events, (a, b) -> a[1] - b[1]);
// dp[i][j] = i번째 이벤트까지 고려했을 때 j개의 이벤트를 선택한 최대 값
int[][] dp = new int[n + 1][k + 1];
// dp 초기화
for (int i = 1; i <= n; i++) {
int[] curr = events[i - 1]; // i번째 이벤트
int start = curr[0]; // 시작일
int value = curr[2]; // 가치
// 이전 겹치지 않는 이벤트 index 찾기
int idx = binarySearch(events, start);
// 아래 텍스트 필드 설명 참고
for (int j = 1; j <= k; j++) {
// 안 고름
dp[i][j] = Math.max(dp[i][j], dp[i - 1][j]);
// 고름 (이전 겹치지 않는 이벤트까지 고려)
dp[i][j] = Math.max(dp[i][j], dp[idx + 1][j - 1] + value);
}
}
return dp[n][k];
}
// 가장 가까운 end <= start - 1인 index를 찾음
private int binarySearch(int[][] events, int start) {
int left = 0;
int right = events.length - 1;
int res = -1;
while (left <= right) {
int mid = (left + right) / 2;
if (events[mid][1] < start) {
res = mid;
left = mid + 1;
} else {
right = mid - 1;
}
}
return res;
}
}
dp[i][j]는 항상
i번째 이벤트까지 고려했을 때
j개의 이벤트를 선택한 최대 값을 가지게 됨
(j개 보다 적게 선택한 값이 최대값일 경우 해당 값을 가져옴)
EX) events = [[1,2,4],[2,3,10],[3,4,3]], k = 2
3일차에서 2개 선택한 이벤트의 가치(7)가
2일차 1개 선택한 이벤트의 가치(10)을 계승함

Share article