연속된 수의 합이 특정값인 경우를 전부 세는 문제이다.
첫번째 풀이는 삼중반복문이라서 시간초과가 생겼다.
두번째 풀이는 시간초과는 없으나 다른사람들의 풀이보다 반복문을 한번 더 돌리기 때문에 시간이 더 걸렸다.
세번째 풀이는 반복문을 한번만 돌려서 결과를 출력한다.
#include <iostream>
#include <vector>
using namespace std;
void input_info(int* N, int* M, vector <int>& v)
{
int i, temp;
v.push_back(0);
cin >> *N >> *M;
for (i = 1; i <= *N; i++)
{
cin >> temp;
v.push_back(temp + v[i-1]);
}
return;
}
void find_result(int N, int M, vector <int> v)
{
int count = 0;
int i, j, length, sum;
/*//시간초과 발생
for (length = 1; length <= N; length++)
{
for (i = 0; i <= N - length; i++)
{
sum = 0;
for (j = i; j < i + length; j++)
{
sum += v[j];
if (sum > M)
{
break;
}
}
if (sum == M)
{
count++;
}
}
}*/
//실행시간 44ms
/*for (length = 1; length <= N; length++)
{
for (i = 0; i < N - length + 1; i++)
{
if ((v[i + length] - v[i]) == M)
{
count++;
}
}
}*/
//실행시간
int start = 0;
int end = 0;
while (end <= N)
{
sum = v[end] - v[start];
if (sum < M)
{
end++;
}
else if (sum == M)
{
count++;
end++;
}
else
{
start++;
}
}
cout << count << "\n";
return;
}
int main(void)
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int N, M;
vector <int> v;
input_info(&N, &M, v);
find_result(N, M, v);
return 0;
}