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 |
Tags
- java
- Unity Editor
- SDK upgrade
- mongoDB
- server
- rpg server
- Packet Network
- Git
- linux
- unity
- Camera Zoom
- nodejs
- docker
- css framework
- Digital Ocean
- Camera Movement
- Google Developer API
- MySQL
- OverTheWire
- --watch
- screencapture
- critical rendering path
- spread 연산자
- draganddrop
- springboot
- express
- Unity IAP
- react
- Google Refund
- Spring Boot
Archives
- Today
- Total
우당탕탕 개발일지
[프로그래머스] Level 2. 연속된 부분 수열 본문
https://school.programmers.co.kr/learn/courses/30/lessons/178870
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
1. 실패코드
그냥 처음부터 더해가면서 합이 k인 부분을 찾는 직관적인 방법 -> 시간초과 발생
#include <string>
#include <vector>
using namespace std;
int s = -1; int e = -1;
void change_answer(vector<int>& seq, int i, int j){
if(s == -1){
s = i; e = j;
return;
}
if(j-i > e-s) return;
if(j-i < e-s){
s = i; e = j; return;
}
if(i<s){
s = i; e = j; return;
}
}
vector<int> solution(vector<int> sequence, int k) {
vector<int> answer;
for(int i=0;i<sequence.size(); i++){
int sum = 0;
for(int j=i; j<sequence.size(); j++){
sum += sequence[j];
if(s != -1 && e-s < j-i)break;
if(sum <k) continue;
else if(sum >k) break;
change_answer(sequence, i,j);
break;
}
}
answer.push_back(s);
answer.push_back(e);
return answer;
}
2. 성공코드
그래서 s = 0, e = 0에서부터 시작해서 뒤에서넣고, 앞에서 빼면서 계산하는 방식으로 변경하였다.
- 만약 sum이 k보다 크다면, s에서부터 시작하는 수열검사는 끝났으므로, sum에서 s번째값을 뺀 뒤 s+1을 한다. (sum이 k보다 크지 않을때까지 계속 빼준다.)
- 만약 sum 이 k보다 작다면, 뒤에있는 요소를 추가한 뒤 e +1 한다.
- 만약 sum이 k와 동일하다면 (조건합격) , change_answer()을 호출하여 답을 갱신한다(갱신할 조건이라면)
#include <string>
#include <vector>
#include <queue>
#include <iostream>
using namespace std;
int startIdx = -1;
int endIdx = -1;
void change_answer(int i, int j){
if(startIdx == -1){
startIdx = i;
endIdx =j;
return;
}
if(j-i > endIdx-startIdx) return;
if(endIdx-startIdx > j-i){
startIdx = i; endIdx = j; return;
}
if(i < startIdx){
startIdx = i; endIdx =j; return;
}
}
vector<int> solution(vector<int> sequence, int k) {
vector<int> answer;
int s= 0; int e=0;
long long sum = 0;
for(int i=0; i<sequence.size(); i++){
sum += sequence[i];
e = i;
while(sum >k && s<e){
sum -= sequence[s];
s++;
}
//cout << s <<","<<e<<", sum:"<<sum<<endl;
if( sum < k) continue;
else if(sum == k){
change_answer(s,e);
}
}
answer.push_back(startIdx);
answer.push_back(endIdx);
return answer;
}
'Algorithm(c++) > Level 2' 카테고리의 다른 글
[프로그래머스] Level 2. 점프와 순간이동 (0) | 2025.02.19 |
---|---|
[프로그래머스] Level 2. 리코쳇 로봇 (1) | 2025.02.17 |
[프로그래머스] Level 2. 혼자서 하는 틱택토 (0) | 2025.02.15 |
[프로그래머스] Level 2. 두 원 사이의 정수쌍 (0) | 2025.02.13 |
[프로그래머스] Level 2. 아날로그 시계 (0) | 2025.02.12 |