이중 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 |
댓글