[투 포인터] 예제 문제: 수들의 합 2_백준

Jin Hur·2021년 9월 16일

알고리즘(Algorithm)

목록 보기
19/49

투 포인터

두 개의 포인터를 이동시키면서 부분 배열의 합을 구한다.
부분 배열의 합을 구하는 것은 포인터가 가리키는 값의 추가, 포인터 이동에 따른 값 가감에 따라 O(1)의 시간 복잡도로 수행된다.


source: https://ssungkang.tistory.com/entry/Algorithm-Two-Pointers-%ED%88%AC-%ED%8F%AC%EC%9D%B8%ED%84%B0


예제 문제: 수들의 합2_백준

source: https://www.acmicpc.net/problem/2003

투 포인터 풀이

#include <iostream>
#include <vector>
using namespace std;

int N, M;
vector<int> A(10000);

int solution() {
	int cnt = 0;
	long long hap = 0;

	int end = 0;
	int start = 0;
	hap += A[0];

	while (true) {
		// 현재 값을 판단
		if (hap == M) {
			cnt++;

			end++;
			if (end >= N)
				break;
			hap += A[end];

			hap -= A[start];
			start++;
		}
		else if (hap > M) {
			hap -= A[start];
			start++;
		}
		else {	// hap < M
			end++;
			if (end >= N)
				break;
			hap += A[end];
		}
	}

	return cnt++;
}

int main() {
	cin >> N >> M;

	for (int i = 0; i < N; i++) {
		cin >> A[i];
	}

	int result = solution();
	cout << result << endl;
}

0개의 댓글