Leetcode Java Maximum Number of Events That Can Be Attended II
업데이트:
문제
코드
class Solution {
public int maxValue(int[][] events, int k) {
if (k == 1) {
return Arrays.stream(events).max(Comparator.comparingInt(e -> e[2])).orElseThrow()[2];
} else {
Arrays.sort(events, Comparator.comparingInt(e -> e[0]));
int length = events.length;
int[][] dp = new int[length + 1][k + 1];
for (int i = length - 1; i >= 0; i--) {
int next = this.binarySearch(events, events[i][1], i + 1, length);
for (int j = 1; j <= k; j++) {
dp[i][j] = Math.max(dp[i + 1][j], dp[next][j - 1] + events[i][2]);
}
}
return dp[0][k];
}
}
private int binarySearch(int[][] events, int target, int start, int end) {
while (start < end) {
int mid = ((end - start) / 2) + start;
if (target >= events[mid][0]) {
start = mid + 1;
} else {
end = mid;
}
}
return start;
}
}
결과
설명
- 아래 구성으로 된 events를 이용하여 겹치지 않은 이벤트에 참석하여 얻을 수 있는 최대 값을 반환하는 문제이다.
- events[i] = [startDayi, endDayi, valuei]로 구성되어 있으며, 각 값은 아래의 의미를 가진다.
- startDayi는 i번째 이벤트 시작 날자를 의미한다.
- endDayi는 i번째 이벤트 종료 날자를 의미한다.
- valuei는 i번째 이벤트 참석을 통해 얻을 수 있는 값을 의미한다.
- events[i] = [startDayi, endDayi, valuei]로 구성되어 있으며, 각 값은 아래의 의미를 가진다.
-
k가 1인 하나의 이벤트만 참석하는 경우, 모든 이벤트 중 가장 큰 value 값을 주어진 문제의 결과로 반환한다.
-
events를 시작 날자인 첫 값 기준으로 오름차순 정렬한다.
- 문제 풀이에 필요한 변수를 정의한다.
- length는 events의 길이를 저장한 변수이다.
- dp는 최대 값을 구하기 위한 배열로, $(length + 1) \times (k + 1)$ 크기의 2차원 배열로 초기화한다.
- $length - 1$부터 0 이상까지 i를 감소시키며 아래를 반복한다.
- next에 $i + 1$번째 이벤트에서 마지막 이벤트까지 i번째 events의 종료 날자 이후에 시작하는 이벤트의 위치를 찾아 넣어준다.
- 1부터 k이하까지 j를 증가시키며 dp[i][j]의 위치에 dp[$i + 1$][k] 값인 다음 이벤트까지의 값과 $dp[next][j - 1] + events[i][2]$의 값인 해당 이벤트를 포함한 값의 합 중 큰 값을 넣어준다.
- 반복이 완료되면 조건을 만족하는 최대 값이 저장된 dp[0][k]의 값을 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기