728x90
반응형
📌 문제 설명
어떤 수열의 연속 부분 수열에 같은 길이의 펄스 수열을 각 원소끼리 곱하여 연속 펄스 부분 수열을 만들려 합니다. 펄스 수열이란 [1, -1, 1, -1 …] 또는 [-1, 1, -1, 1 …] 과 같이 1 또는 -1로 시작하면서 1과 -1이 번갈아 나오는 수열입니다.
예를 들어 수열 [2, 3, -6, 1, 3, -1, 2, 4]의 연속 부분 수열 [3, -6, 1]에 펄스 수열 [1, -1, 1]을 곱하면 연속 펄스 부분수열은 [3, 6, 1]이 됩니다. 또 다른 예시로 연속 부분 수열 [3, -1, 2, 4]에 펄스 수열 [-1, 1, -1, 1]을 곱하면 연속 펄스 부분수열은 [-3, -1, -2, 4]이 됩니다.
정수 수열 sequence가 매개변수로 주어질 때, 연속 펄스 부분 수열의 합 중 가장 큰 것을 return 하도록 solution 함수를 완성해주세요.
📌 제한 사항
- 1 ≤ sequence의 길이 ≤ 500,000
- -100,000 ≤ sequence의 원소 ≤ 100,000
- sequence의 원소는 정수입니다.
📌 입출력 예
sequence | result |
[2, 3, -6, 1, 3, -1, 2, 4] |
10 |
🔗 문제 링크
https://school.programmers.co.kr/learn/courses/30/lessons/161988
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
반응형
💡 풀이 아이디어
- 카데인 알고리즘
📝 최종 풀이
- 1부터 시작하는 펄스 수열과 -1부터 시작하는 펄스 수열을 초기화합니다.
- 각각의 펄스 수열과 곱한 결과의 최대 부분합을 계산합니다.
- 이전까지의 최대 합에 현재 원소를 더한 값과 현재 원소 값을 비교합니다.
- 두 가지 경우의 최대 부분 합 중 더 큰 값을 return 합니다.
728x90
👩💻 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
long long solution(vector<int> sequence) {
int n = sequence.size();
vector<int> pulse1(n), pulse2(n);
for (int i = 0; i < n; i++) {
pulse1[i] = (i % 2 == 0) ? 1 : -1;
pulse2[i] = (i % 2 == 0) ? -1 : 1;
}
long long maxSum1 = 0;
long long maxSum2 = 0;
long long currentSum1 = 0;
long long currentSum2 = 0;
for (int i = 0; i < n; i++) {
currentSum1 = max((long long)sequence[i] * pulse1[i], currentSum1 + (long long)sequence[i] * pulse1[i]);
maxSum1 = max(maxSum1, currentSum1);
currentSum2 = max((long long)sequence[i] * pulse2[i], currentSum2 + (long long)sequence[i] * pulse2[i]);
maxSum2 = max(maxSum2, currentSum2);
}
return max(maxSum1, maxSum2);
}
728x90
반응형
'코딩테스트 > 프로그래머스' 카테고리의 다른 글
[프로그래머스] 경주로 건설 (1) | 2024.11.28 |
---|---|
[프로그래머스] 디스크 컨트롤러 (0) | 2024.11.28 |
[프로그래머스] 여행경로 (0) | 2024.11.24 |
[프로그래머스] 징검다리 건너기 (0) | 2024.11.23 |
[프로그래머스] 섬 연결하기 (0) | 2024.11.22 |