본문 바로가기

algorithm/BOJ

백준 2003_수들의 합 2(C++)

 

www.acmicpc.net/problem/2003

 

2003번: 수들의 합 2

첫째 줄에 N(1≤N≤10,000), M(1≤M≤300,000,000)이 주어진다. 다음 줄에는 A[1], A[2], …, A[N]이 공백으로 분리되어 주어진다. 각각의 A[x]는 30,000을 넘지 않는 자연수이다.

www.acmicpc.net

[문제 풀이]

투 포인터를 이용하여 문제를 풀었습니다.

 

이 문제는 

A[i] ~A[j]의 합이 M인 경우의 수를 찾는 문제입니다.

 

시간제한이 넉넉하여서 투 포인터를 이용하여 찾았습니다. 두 개의 포인터 중 뒤쪽 포인터는 굳이 지정하지 않고 i로 계속 변화를 주었습니다. 앞 쪽 포인터를 고정한 후 i를 늘려가며 합이 M과 같아지면 더해주는 식으로 구현하였습니다.

[코드]

#include<iostream>

using namespace std;

int N, M;
long long answer = 0;

int arr[10001];

int main() {

	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> N >> M;

	for (int i = 0; i < N; i++) 
		cin >> arr[i];

	int pre_idx = 0;

	while (pre_idx < N) {

		long long sum = 0;

		for (int i = pre_idx; i < N; i++) {
			sum += arr[i];

			if (sum == M) {
				answer++;
				break;
			}
		}

		pre_idx++;

	}

	cout << answer << endl;

	return 0;

}

 

 

'algorithm > BOJ' 카테고리의 다른 글

백준 1072_게임(C++)  (0) 2020.10.06
백준 2805_나무 자르기(C++)  (0) 2020.10.06
백준 1103_게임(C++)  (0) 2020.10.05
백준 1039_교환(C++)  (2) 2020.10.04
백준 1339_단어 수학(C++)  (0) 2020.10.01