Heeto
article thumbnail
링크 : https://school.programmers.co.kr/learn/courses/30/lessons/161988
 

프로그래머스

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

programmers.co.kr

 

코드


def solution(sequence):
    table = [[0 for _ in range(len(sequence) + 1)] for _ in range(2)]
    weight = 1
    for i in range(len(sequence)):
        table[0][i + 1] = table[0][i] + sequence[i] * weight
        table[1][i + 1] = table[1][i] - sequence[i] * weight
        weight *= -1
    return max(max(table[0]) - min(table[0]), max(table[1]) - min(table[1]))

 

풀이


누적합을 이용한 풀이이다. 내가 해결한 코드는 아니고 '다른 사람의 풀이'에서 가장 위에 있던 코드를 가져와봤다.

나는 투포인터를 사용해서 이리저리 휘둘리다가 포기해버렸다...

 

sequence를 한 번 탐색(O(n))하며 펄스(1,-1)별로 누적합을 구한다.

이렇게 만들어진 누적합 배열에서 합이 최대인 부분수열을 구하는 방법은 (최대값 - 최소값)이다.

 따라서 두 펄스에서의 누적최대값을 구하면 간단하게 해결이 가능하다.

profile

Heeto

@Heeto

🐧 블로그를 옮기는 과정에서 문법과 구성에 조금씩 오류가 있을 수 있습니다. 틀린 부분이 있다면 언제든지 알려주세요. 🐧