https://www.acmicpc.net/problem/1806
1. Logic
- 인덱스를 가르키는 두개의 포인터 변수(start, end)를 선언 한 뒤 원하는 수보다 sum이 작으면 다음 배열로 end를 옮기고 vec[end] 더해주고 크면 vec[start]를 빼주고 start 포인터를 하나 더해준다.
Testcase 하나를 예시로 들어보면
Testcase
10 4
5 1 3 5 10 7 4 9 2 2
여기서 더해서 4가 되는 연속되는 인덱스는 [1, 2], [6], [8, 9]이다.
첫 포인터 생성은 Start = 0; End = 0;으로 초기화를 해주고 우리는 먼저 End를 옮겨주면서 부분합을 sum에 더해줄 것이다.
부분 합 : sum, 원하는 값 : m
1. sum < m (현재 부분합이 우리가 원하는 부분합보다 작을 때)
- end 증가
- sum += vec[end] (end 인덱스의 값)
2. sum == m (현재 부분합이 우리가 원하는 부분합이랑 일치할 때)
- end 증가
- sum += vec[end] (end 인덱스의 값)
- sum -= vec[start] (start인덱스의 값)
- start 증가
3. sum > m (현재 부분합이 우리가 원하는 부분합보다 클 때)
- sum -= vec[start] (start인덱스의 값)
- start 증가
이때 원하는 Value 인 4와 구간합이 일치하기 때문에 부분합의 길이인 (end - start + 1) = 2를 저장해준다
그리고 이후에 원하는 Value 값이 나왔기때문에 end를 하나 증감하면 다음번에는 또 하나를 내려줘야하기때문에 한번에 end와 start를 올려주고 sum값을 계산해줬다.
2. Code
#include<bits/stdc++.h>
using namespace std;
vector<int> vec;
const int INF = 0x3f3f3f3;
int main() {
ios_base::sync_with_stdio(false); cout.tie(0); cin.tie(0);
int n, m;
cin >> n >> m;
for(int i = 0; i < n; i++) {
int a;
cin >> a;
vec.push_back(a);
}
int start = 0;
int end = 0;
int sum = vec[0];
int length = INF;
while(end < n) { // end가 끝까지 가봐야 n최대
if(sum >= m) // length 갱신해주는 조건이 m이상이기 떄문에
length = min(length, end - start + 1);
if(sum < m) {
end++;
sum += vec[end];
}
else if(sum == m) {
end++;
sum += vec[end];
sum -= vec[start];
start++;
}
else if(sum > m) {
sum -= vec[start];
start++;
}
}
if(length == INF) {
cout << '0';
}
else {
cout << length;
}
}
3. Feedback
투포인터를 처음 공부하고 풀은 문제라 조금 뚝딱댔지만 블로그를 쓰면서 실제로 포인터를 옮겨보니 어떻게 동작하는지 이해가 더 잘가는 것 같다. 투포인터를 몰랐을 때는 브루트포스로 풀으려다가 너무 입력값이 커서 놀랐지만 이젠 투포인터도 떠올려볼 수 있게 됐다.
알고리즘 Solve 후 제가 생각한 Logic을 기록하는 개인 공부 블로그입니다.
내용 중 최적화가 가능한 부분등은 언제든지 댓글로 틀린 부분 및 피드백 주시면 공부 및 반영하겠습니다🧐
'Algorithm > Beakjoon' 카테고리의 다른 글
[백준/Baekjoon] 2470 두 용액 C++ :: Two pointers (0) | 2023.08.21 |
---|---|
[백준/Baekjoon] 2003 수들의 합 2 C++ :: two pointers (0) | 2023.08.21 |
[백준/Baekjoon] 2573 빙산 C++ :: BFS (0) | 2023.08.20 |
[백준/Baekjoon] 9465 스티커 C++ :: Dynamic Programming (0) | 2023.08.19 |
[백준/Baekjoon] 14719 빗물 C++ :: Implement (0) | 2023.08.17 |