Leetcode Java K-Concatenation Maximum Sum
업데이트:
문제
코드
class Solution {
public int kConcatenationMaxSum(int[] arr, int k) {
long currentMax = arr[0] > 0 ? arr[0] : 0L;
long max = currentMax;
long sum = arr[0];
int length = arr.length;
for (int i = 1; i < Math.min(k, 2) * length; i++) {
currentMax = Math.max(currentMax + arr[i % length], arr[i % length]);
max = Math.max(currentMax, max);
if (i < length) {
sum += arr[i];
}
}
while (sum > 0 && --k >= 2) {
max = (max + sum) % 1000000007;
}
return (int) max % 1000000007;
}
}
결과
설명
- arr의 값이 k번 이어진 배열에서 부분 배열의 합이 최대인 값을 구하는 문제이다.
- 부분 배열의 값이 없는 경우, 합은 0이다.
- 부분 배열의 합이 매우 클 수 있으므로, 모듈러 $10^9 + 7$을 적용한다.
- 문제 풀이에 필요한 변수를 정의한다.
- currentMax와 max는 Kadane’s algorithm방식으로 문제 풀이를 하기 위한 변수로, 첫 값이 0보다 크면 해당 값을 아니면 빈 부분 배열의 합인 0을 넣어준다.
- sum은 arr의 값을 더해줄 변수로, arr[0]의 값을 넣어준다.
- 1부터 k가 2보다 크면 $2 \times k$, 아니면 length까지 i를 증가시키며 아래를 반복한다.
- currentMax에 아래 중 큰 값을 넣어준다.
- currentMax에 arr의 $\frac{i}{length}$ 값의 몫 위치 값을 더한 값인 현재값까지 최대 합.
- arr의 $\frac{i}{length}$ 값의 몫 위치 값.
- max에 두 값 중 큰 값을 넣어준다.
- 이전까지 최대 값인 max.
- 현재까지 최대 값인 currentMax.
- i가 length 미만인 경우, sum에 arr[i] 값을 누계해준다.
- currentMax에 아래 중 큰 값을 넣어준다.
-
반복이 완료되면 sum이 0보다 크면서 k를 감소한 값이 2보다 클 때 까지, max에 $max + sum$에 모듈러 $10^9 + 7$를 적용한 값을 넣어준다.
- 최종 결과가 저장된 max애 모듈러 $10^9 + 7$를 적용한 값을 반환 목표인 int형으로 변환하여 주어진 문제의 결과로 반환한다.
소스
Sample Code는 여기에서 확인 가능합니다.
댓글남기기