블로그

[2일차] 시간복잡도 A - 2003: 수들의 합 2 본문

SDS ( -> PS)

[2일차] 시간복잡도 A - 2003: 수들의 합 2

왕방토 2022. 1. 6. 01:20
728x90

실버 Ⅲ

 

#include <iostream>

int arr[10000] = { 0, };

int main() {
	int N, M;
	scanf("%d%d", &N, &M);

	for (int i = 0; i < N; i++) {
		scanf("%d", &arr[i]);
	}

	int sum = 0;
	int low = 0;
	int high = 0;
	int ans = 0;
	while (high <= N) {
		if (sum == M) {
			ans++;
			sum += arr[high];
			high++;
		}
		else if (sum < M) {
			sum += arr[high];
			high++;
		}
		else {
			sum -= arr[low];
			low++;
		}
	}
	printf("%d", ans);
}

처음 푼 투 포인터 문제

 

① 구간의 무언가를 구하는...(ex - 부분합)

② 그리고 그 구간이 유동적으로 변하는... (구간의 값이 바뀐다는게 아니라 구간 자체가 바뀌는)

(구간의 값이 자주 바뀌는거는 세그먼트 트리를 쓰는게 나음)

 

그런 문제에 쓰기 좋은 알고리즘이다

 

++추가++

if (sum == M) {
ans++;
sum += arr[high++];

이 부분에서, sum += arr[high++];를 하든 sum -= arr[low++] 를 하든 아무 상관 없다

Comments