Algorithm
[프로그래머스]LV 3 연속 펄스 부분 수열의 합
누룽지_
2024. 11. 10. 21:51
https://school.programmers.co.kr/learn/courses/30/lessons/161988
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
접근 방법
- 최대 50만 길이의 배열이 input으로 들어온다. 즉 O(nlogn) 이하의 알고리즘이 가능하다
- 입력 배열에 각각 [1,-1,1,-1 ,1,-1...] [-1,1 -1,1, -1,1...]을 곱한 두가지 케이스에서 최대 부분수열의 max값을 찾아야한다
- 따라서 dp 배열에 0번 열에는 +값만, 1번 열에는 -값을 저장한다
- 즉, (i,0) 에는 (i-1,1) + seq[i]값이 0보다 크면 들어온다. (i,1) 에는 (i-1,0) - seq[i]값이 0보다 크면 들어온다
코드
class Solution {
public long solution(int[] sequence) {
int n = sequence.length;
long[][] dp = new long[n][2];
dp[0][0] = sequence[0];
dp[0][1] = -sequence[0];
for(int i = 1 ; i < n ; 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];
}
long ans = 0L;
for(long[] d: dp) ans = Math.max(ans, Math.max(d[0], d[1]));
return ans;
}
}