티스토리 뷰

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

접근 방법

  1. 몇 번째 요소에서 시작하던지, 수열을 1로 시작한 펄스와 -1로 시작한 펄스가 곱해진 두 개의 수열만 고려하면 됨
    1. index 값에 따라 1과 -1로 값이 교차되는 pulse 변수 사용
  2. 최선의 답을 구하기 위해 0 부터 n-1까지 순회를 해야하긴 하지만, 여기서 중요한 점은 어떤 index에서 어떤 선택을 해야 최선의 답이 나올 것인지이다
    1. DP를 사용하여 각 수열에 대해서, a) 현재 index까지의 연속된 누적합 + 현재의 sequence 값 b) 현재의 sequence 값를 비교해서 더 높은 값을 기록한다.
      1. dp[i] = max( _sequence[i] , _sequence[i] + dp[i-1] )
    2. 언제 제일 높은 값이 나올 지 모르기 때문에 매 순회마다 answer, a_max, b_max의 값을 비교해준다.

코드

def solution(sequence):
    answer = -1e9
    a_max = b_max = 0
    pulse = 1
    for i in range(len(sequence)):
        a = sequence[i] * pulse
        b = sequence[i] * -pulse
        a_max = max(a, a + a_max)
        b_max = max(b, b + b_max)
        answer = max(answer, a_max, b_max)
        pulse *= -1
    return answer

후기

문제와 해결법이 직관적이지 않아 이해하기 어려웠던 문제 ㅠㅠ

'Algorithm' 카테고리의 다른 글

등산코스 정하기 (Python)  (0) 2023.09.19
광고 삽입 (Java)  (0) 2023.09.17
표현 가능한 이진트리 (Java)  (0) 2023.09.14
[BOJ] 2623번 : 음악 프로그램 (Java)  (0) 2023.09.11
가장 긴 팰린드롬 (Java)  (0) 2023.09.10
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/07   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
글 보관함