문제/프로그래머스

[프로그래머스] 연속 펄스 부분 수열의 합 - Java

icodesiuuuu 2024. 9. 9. 13:54

문제

https://school.programmers.co.kr/learn/courses/30/lessons/161988

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 


sequence 배열에 -1, 1, -1 · · · 순서로 곱한 배한 배열, 1, -1, 1 · · · 순서로 곱한 배열 각각의 배열에서 연속된 부분 배열의 합이 가장 큰 값을 찾아 return 해주면 된다.

연속된 부분 배열의 합이 가장 큰 값을 찾는 알고리즘으로 kadane 알고리즘을 활용하면 된다

 

https://icodesiuuuu.tistory.com/12

 

Kadane’s Algorithm (카데인 알고리즘)

Kadane 알고리즘은 주어진 배열에서 연속된 부분 배열의 합이 가장 큰 값을 효율적으로 찾는 알고리즘. 이 알고리즘은    동적 프로그래밍(Dynamic Programming)의 일종으로, 선형 시간 복잡도 O(n)을 가

icodesiuuuu.tistory.com

 

import java.util.*;
class Solution {
    static long max;
    public long solution(int[] sequence) {
        long answer = 0;
        max = 0;
        int[] a = sequence.clone();
        int[] b = sequence.clone();
        
        for(int i=0; i<sequence.length; i++) {
            if(i%2 == 0) {
                a[i] *= -1;
            } else {
                b[i] *= -1;
            }
        }
        kadane(a);
        kadane(b);
        return max;
    }
    
    public static void kadane(int[] arr) {
        long cur = 0;
        for(int i=0; i<arr.length; i++) {
            cur = Math.max(arr[i], cur+arr[i]);
            max = Math.max(cur, max);
        }
    }
}