https://school.programmers.co.kr/learn/courses/30/lessons/161988
1. DP 점화식 세우기
어떤 수를 사용했는가는 관심사가 아니므로, i번째에 이룰 수 있는 최댓값만 기록
dp[i][0] = i번째가 1 * sequence[i]일 때 이룰 수 있는 최댓 값
dp[i][1] = i번째가 -1 * sequence[i]일 때 이룰 수 있는 최댓 값
2. 최댓 값 산정 방식
dp[i][0] = Math.max(dp[i-1][1], 0) + sequence[i];
dp[i][1] = Math.max(dp[i-1][0], 0) - sequence[i];
i-1 이 음수라면 i번 째 값을 낮추기만 하므로 최댓 값 해에 포함하지 않는다.
3. 출력
dp[dp.length()-1]이 아닌, dp[0~ dp.length()-2]에 해당하는 부분 수열이 정답일 수 있으므로 for each문으로 정답 도출
4. 고려 사항
문제에서, sequence는 5만 이하
원소 값은 -10만 이상 10만 이하
최대 (5만/2 * 10만) - (5만/2 *-10만) = 50억 이므로 long 사용
class Solution {
public long solution(int[] sequence) {
long answer = 0;
int sl = sequence.length;
long dp[][] = new long[sl][2];
dp[0][0] = sequence[0];
dp[0][1] = -sequence[0];
for(int i=1; i<sl; i++) {
dp[i][0] = Math.max(dp[i-1][1], 0) + sequence[i];
dp[i][1] = Math.max(dp[i-1][0], 0) - sequence[i];
}
for(long[] col : dp)
answer = Math.max(answer, Math.max(col[0], col[1]));
return answer;
}
}
'[프로그래머스] 절대 외부 IDE를 써선 안돼 > Java' 카테고리의 다른 글
[lv3] 다단계 칫솔 판매 (0) | 2024.11.08 |
---|---|
[lv3] 부대 복귀 (0) | 2024.11.07 |
[lv3] 보석 쇼핑 (3) | 2024.11.05 |
[lv3] 불량 사용자 (0) | 2024.11.05 |
[lv3] 스티커 모으기(2) (0) | 2024.11.04 |