백준 2003 c++

magicdrill·2024년 2월 26일

백준 문제풀이

목록 보기
29/673

백준 2003 c++

연속된 수의 합이 특정값인 경우를 전부 세는 문제이다.
첫번째 풀이는 삼중반복문이라서 시간초과가 생겼다.
두번째 풀이는 시간초과는 없으나 다른사람들의 풀이보다 반복문을 한번 더 돌리기 때문에 시간이 더 걸렸다.
세번째 풀이는 반복문을 한번만 돌려서 결과를 출력한다.

#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;
}

0개의 댓글