Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
Tags
- springboot
- screencapture
- nodejs
- linux
- Google Developer API
- Packet Network
- Camera Movement
- express
- unity
- Unity Editor
- draganddrop
- --watch
- react
- mongoDB
- Spring Boot
- Unity IAP
- Git
- MySQL
- OverTheWire
- server
- java
- spread 연산자
- Google Refund
- Digital Ocean
- css framework
- rpg server
- docker
- critical rendering path
- Camera Zoom
- SDK upgrade
Archives
- Today
- Total
우당탕탕 개발일지
[프로그래머스] Level 3. 연속 펄스 부분 본문
https://school.programmers.co.kr/learn/courses/30/lessons/161988
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
해결 방법
- sequence 에 연속펄스 (-1,1,-1...) 을 곱한 v1 과 , (1,-1,1,..)을 곱한 v2를 만든다.
- 이 두 배열에 대해 getMax() 함수를 수행하는데, 이 함수는 가능한 연속부분수열 합의 최대값을 찾는함수이다.
- 맨 첫번째 요소부터 더한다. 만약 양수라면, 더하는것이 무조건 이득이므로, sum 을 증가시킨다. (sum이 증가할때 항상 answer을 갱신시도한다)
- 만약 음수이고, 지금까지 더했던 값보다도 훨씬 작은수라면, 앞에있는 값들을 모두 버리는게 이득이다. 따라서 sum = 0 으로 초기화하고 넘어간다.
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
long long answer = 0;
void getMax(vector<int> sequence){
long long sum = 0;
for(int i=0; i<sequence.size(); i++){
if(sequence[i] < 0 && sum + sequence[i] <0){
sum = 0;
continue;
}
sum += sequence[i];
answer = max(sum,answer);
}
}
long long solution(vector<int> sequence) {
vector<int> v1 = sequence;
vector<int> v2 = sequence;
for(int i=0; i<sequence.size(); i++){
if(i%2 ==0 ) v1[i]*=-1;
else v2[i] *=-1;
}
getMax(v1);
getMax(v2);
return answer;
}
'Algorithm(c++) > Level 3' 카테고리의 다른 글
[프로그래머스] Level 3. 디스크 컨트롤러 (0) | 2025.03.09 |
---|---|
[프로그래머스] Level 3. 입국 심사 (0) | 2025.03.09 |
[프로그래머스] Level 3. 가장 먼 노드 (0) | 2025.03.05 |
[프로그래머스] Level 3. 징검다리 건너기 (0) | 2025.03.03 |
[프로그래머스] Level 3. 보석 쇼핑 (0) | 2025.03.02 |