https://www.acmicpc.net/problem/1806
시간 0.5초, 메모리 128MB
input :
output :
아이템이 1개일 때도 생각해 줘야 하지 않나 생각하다가, 합을 만드는 게 불가능한 경우를 예외처리 안 해줬다 ㅋㅋㅋㅋㅋㅋㅋㅋ
아이템 1개일 때도 해주려면, 그냥 back_idx를 0 부터 시작하면 되겠다.
근데 진짜 왜 되지?
과거에 왜 저렇게 적었는지도 모르겠다.
추가된 데이터는 딱 내가 제출한 코드를 저격한 케이스였다.
10 10
10 1 1 1 1 1 1 1 1 1
ans : 1
시작할 떄 부터 backidx를 1로 지정했으니 걸릴 수 밖에 없다.
모든 합을 구한다면 시간이 터질거다. 투포인터를 사용하자.
투포인터가 끝나려면 꼭 start가 end보다 커져야 하나? 근데 그게 끝까지 안 가고 발생하면?
이라는 문제가 존재한다.
end가 배열의 밖으로 나간다는 의미는 해당 부분합이 S보다 작은데 더 이상 원소도 없다는 의미이다. 결국 끝까지 다 돌면 되는 것이다.
구현이 좀 귀찮았다.
import sys
n, s = map(int, sys.stdin.readline().split())
data = list(map(int, sys.stdin.readline().split()))
ans = float("inf")
start, end = 0, 0
temp = data[0]
while True:
if start > end:
end = start + 1
if end < n:
temp += data[end]
continue
if temp >= s:
ans = min(ans, end - start + 1)
temp -= data[start]
start += 1
continue
end += 1
if end >= n:
break
temp += data[end]
print(0 if ans == float("inf") else ans)
#include <iostream>
#include <vector>
using std::cout;
using std::cin;
using std::endl;
using std::vector;
using std::min;
int n, s;
vector<int> data;
int main() {
int start = 0;
int end = 0;
cin >> n >> s;
for (int i = 0; i < n; ++i) {
int temp;
cin >> temp;
data.push_back(temp);
}
int temp = data[0];
int ans = 1000000000;
while (end < n){
if (start > end){
end = start + 1;
if (end < n)
temp += data[end];
continue;
}
if (temp >= s){
ans = min(ans, end - start + 1);
temp -= data[start];
start += 1;
continue;
}
end += 1;
if (end >= n)
break;
temp += data[end];
}
if (ans == 1000000000)
cout << 0;
else
cout << ans;
return 0;
}