본문 바로가기
알고리즘 일기

2003번: 수들의 합 2

by Beijing_KingGod 2019. 11. 30.

이중 for 문으로 풀기 

#include<iostream>
#include<vector>

using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	vector<int> a(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	int ans = 0;
	for (int i = 0; i < n; i++) {
		int sum = 0;
		for (int j = i; j < n; j++) {
			sum += a[j];
			if (sum == m) { ans++; break; }
		}
	}
	cout << ans << '\n';
	return 0;
}

 

R인덱스와 L 인덱스로 풀기

목표보다 합이 작으면 R을 키우고

목표보다 합이 크면 L을 키우기 

#include<iostream>
#include<vector>

using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	vector<int> a(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	int ans = 0;
	int R = 0;
	int L = 0;
	while (R != n) {
		int sum = 0;
		for (int i = L; i <= R; i++) {
			sum += a[i];
		}
		if (sum > m) { // 합이 목표보다 크다면 L 증가
			L++;
		}
		if (sum < m) { // 합이 목표보다 작다면 R 증가
			R++;
		}
		if (sum == m) { // 합이 목표랑 같다면 ans 증가, R증가
			ans++;
			R++;
		}
	}
	cout << ans << '\n';
	return 0;
}

 

둘다 시간복잡도는 O(N)이다.

 

#include<iostream>
#include<vector>

using namespace std;

int main() {
	int n, m;
	cin >> n >> m;
	vector<int> a(n);
	for (int i = 0; i < n; i++) {
		cin >> a[i];
	}
	int ans = 0;
	int R = 0;
	int L = 0;
	int sum = a[0];
	while (L <= R && R < n) {

		if (sum < m) { // 합이 목표보다 작다면 R증가
			R++;
			if (R >= n) break; // R이 배열 인덱스를 넘어가면 종료
			sum += a[R];
		}
		else if (sum == m) { // 합이 목표랑 같다면 ans+++, R++
			ans++;
			R++;
			if (R >= n) break;// R이 배열 인덱스를 넘어가면 종료
			sum += a[R];
		}
		else if (sum > m) { // 합이 목표보다 크다면 L 증가
			sum -= a[L];
			L++;
			if (L > R && L < n) { // L이 R보다 커지면 ,, 같은 곳을 가리키도록 만듬
				R = L;
				sum = a[L];
			}
		}
	}
	cout << ans << '\n';
	return 0;
}

--> 배열의 인덱스를 넘어가지 않도록 주의하자

 

마지막이 4ms 로 제일 빠르다.

'알고리즘 일기' 카테고리의 다른 글

1644번 : 소수의 연속합  (0) 2019.11.30
1806번 : 부분합  (0) 2019.11.30
프로그래머스 : 종이접기 DP  (0) 2019.11.30
12100번 : 2048(easy) 비트마스크  (0) 2019.11.29
13460번 구슬 탈출2 비트 마스크  (0) 2019.11.29

댓글