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 |