[문제]
https://school.programmers.co.kr/learn/courses/30/lessons/178870?language=cpp
[풀이]
투포인터를 이용해 풀 수 있다. 처음 low와 high 인덱스는 모두 0을 가리킨다.
배열을 누적해서 더해가며 sum이 k보다 작으면 high를 증가시켜 더하고, 커지면 현재 low가 가리키고 있는 값을 뺀 후 low를 증가시킨다. sum과 k가 같다면 더 짧은 부분 수열을 선택할 것이므로 길이를 비교해서 더 짧은 경우 갱신해준다.
[코드]
#include <iostream>
#include <string>
#include <vector>
#include <climits>
using namespace std;
vector<int> solution(vector<int> sequence, int k) {
vector<int> answer;
//부분 수열의 시작 인덱스와 마지막 인덱스를 배열에 담아 return
int low = 0, high = 0;
int minlen = INT_MAX;
int sidx = 0, eidx = 0;
int sum = sequence[low];
while(low<=high){
if(sum < k){
high++;
if(high==sequence.size()) break;
sum += sequence[high];
}
else if(sum==k){
if(minlen > (high-low)){
minlen = high-low;
sidx = low;
eidx = high;
}
high++;
if(high==sequence.size()) break;
sum += sequence[high];
}
else{
sum -= sequence[low];
low++;
}
}
answer.push_back(sidx);
answer.push_back(eidx);
return answer;
}
'알고리즘 공부 및 문제 풀이 > 프로그래머스(PRO)' 카테고리의 다른 글
[pro] 프로그래머스 level2 42885 구명보트 (Java) - 투포인터 (0) | 2023.04.13 |
---|---|
[pro] 프로그래머스 level3 1833 캠핑 (Java) (0) | 2023.04.11 |
[pro] 프로그래머스 level2 12902 3*n 타일링 (Java) - dp (0) | 2023.03.25 |
[pro] 프로그래머스 level1 64061 크레인 인형뽑기 (Java) - 스택 (0) | 2023.03.21 |
[pro] 프로그래머스 level2 131704 택배 상자 (Java) - 시뮬레이션 (0) | 2023.03.07 |