본문 바로가기
Python/알고리즘문제

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

by 붕어사랑 티스토리 2023. 3. 8.
반응형

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

 

프로그래머스

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

programmers.co.kr

 

 

참 알고리즘 공부하는데 아직도 부족하다고 느껴지는 문제였다.

 

 

이 문제의 알고리즘 분류는 누적합 이다

 

 

기억하자.. 특정구간의 합을 구한다 => 누적합을 쓰자

 

 

 

 

1. 아이디어

 

각 펄스 수열의 누적합을 구한다.

특정 구간의 합이 가장 큰 부분의 합은 누적합의 최소값과 최대값의 차이이다

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

 

 

 

아래는 처음에 푼 멍청한 풀이..

 

for문을 돌리며 sum이 -값이 되면 과감히 버려버리고 다시 sum하며 최대값을 구하는 방식으로 했다.

 

def solution(sequence):
    A = []
    B = []
    C = 1
    for i in sequence:
        A.append(i*C)
        B.append(i*-C)
        C = C*(-1)
    maxA = A[0]
    maxB = B[0]
    sumA = 0
    sumB = 0
    for i in A:
        sumA += i
        if sumA < 0:
            sumA = 0
            continue
        maxA = maxA if maxA > sumA else sumA

    for i in B:
        sumB += i
        if sumB <0:
            sumB = 0
            continue
        maxB = maxB if maxB > sumB else sumB

    answer = maxA if maxA > maxB else maxB
    return answer
반응형

'Python > 알고리즘문제' 카테고리의 다른 글

[백준 2592] 부등호  (0) 2023.04.06
[알고스팟] 쿼드 트리 뒤집기  (0) 2023.01.06
[프로그래머스] 사칙연산  (0) 2022.12.28
[백준 2042] 구간 합 구하기  (0) 2022.12.27
[프로그래머스] 등대  (0) 2022.12.26

댓글