728x90
문제 설명
주어진 정수 수열에서 연속 부분 수열에 펄스 수열을 곱하여 얻은 합 중 최대 값을 구하세요.
펄스 수열은 [1, -1, 1, -1, ...] 또는 [-1, 1, -1, 1, ...] 형태입니다.
제한 사항
- 1 ≤ sequence의 길이 ≤ 500,000
- -100,000 ≤ sequence의 원소 ≤ 100,000
해결 방법
알고리즘: 동적 프로그래밍 (Dynamic Programming)
- 두 종류의 펄스 수열에 대해 최대 합을 계산합니다.
- 현재 값과 이전 최대 합을 비교하여 최댓값을 갱신합니다.
- 모든 경우를 탐색하며 최대 값을 반환합니다.
시간 복잡도
- O(n): 수열을 한 번 순회하며 계산.
- 공간 복잡도: O(1): 상수 크기 변수 사용.
function solution(sequence) {
let num1 = sequence[0];
let num2 = -sequence[0];
let answer = Math.max(num1, num2);
for (let i = 1; i < sequence.length; ++i) {
const curNum1 = i % 2 === 0 ? sequence[i] : -sequence[i];
const curNum2 = i % 2 === 1 ? sequence[i] : -sequence[i];
num1 = Math.max(curNum1, num1 + curNum1);
num2 = Math.max(curNum2, num2 + curNum2);
answer = Math.max(num1, num2, answer);
}
return answer;
}
'알고리즘' 카테고리의 다른 글
[Javascript] 프로그래머스 - 부대복귀 (1) | 2025.01.22 |
---|---|
[Javascript] 프로그래머스 - 인사고과 (0) | 2025.01.22 |
[Javascript] 프로그래머스 - 광물 캐기 (1) | 2025.01.16 |
[Javascript] 프로그래머스 - 빛의 경로 사이클 (0) | 2025.01.15 |
[Javascript] 프로그래머스 - 혼자서 하는 틱택토 (1) | 2025.01.14 |