[C/C++]백준 2003

 

백준 2003 - 수들의 합2 (실버3)

2003 문제 링크

N개의 수로 된 수열 A[1], A[2], …, A[N] 이 있다. 이 수열의 i번째 수부터 j번째 수까지의 합 A[i] + A[i+1] + … + A[j-1] + A[j]가 M이 되는 경우의 수를 구하는 프로그램을 작성하시오.
첫째 줄에 N(1 ≤ N ≤ 10,000), M(1 ≤ M ≤ 300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.
벡터에 입력값을 저장하고, 반복문을 통해 벡터에서 값을 하나씩 꺼내서 더해준다. 이를 hap이라고 변수 이름을 만들었다. 이 합의 값이 M과 같아지면 break하는데, hap은 break하면 배열의 다음 값으로 초기화되어야 하므로 반복문 초반에 넣었다.
따로 더하지 않아도 M인 경우를 따로 구해줘야 하므로 반복문 맨 마지막에 포함시켰다.
#include <iostream>
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;
int main() {
	int n, ans, x;
	scanf("%d %d", &n,&ans);
	vector <int> array;
	int result = 0;
	for (int i = 0; i < n; i++) {
		scanf("%d", &x);
		array.push_back(x);
	}
	for (int i = 0; i < n; i++){
		int hap = array[i];
		for (int j = i + 1; j < n; j++) {
			hap += array[j];
			if (hap == ans) {
                //더한 결과가 ans와 같으면 반복문을 종료한다.
				result++;
				break;
			}
		}
		if (ans == array[i]) {
			result++;
		} //array[i]가 m인 경우
		
	}
	printf("%d", result);
	return 0;
}