1806번: 부분합
첫째 줄에 N (10 ≤ N < 100,000)과 S (0 < S ≤ 100,000,000)가 주어진다. 둘째 줄에는 수열이 주어진다. 수열의 각 원소는 공백으로 구분되어져 있으며, 10,000이하의 자연수이다.
www.acmicpc.net
투 포인터를 활용해서 푸는 문제였다.
문제를 이해하는데 어려운 부분은 없었는데
- 이 수열에서 연속된 수들의 부분합 중에 그 합이 S 이상이 되는 것 중, 가장 짧은 것의 길이
나는 저 S 이상이 아니라 정확히 S가 되는 것만 카운팅 되는 줄 알고 30분을 소비했다...
#include <iostream>
#include <algorithm>
using namespace std;
int ar[100001], n, m, s, e, sum, ans = 1e9;
int main() {
ios::sync_with_stdio(false); cin.tie(0);
cin >> n >> m;
for (int i = 0; i < n; i++) cin >> ar[i];
while (1) {
if (sum >= m) {
ans = min(ans, e - s);
sum -= ar[s++];
}
else if (e == n) break;
else sum += ar[e++];
}
if (ans == 1e9) cout << 0 << endl;
else cout << ans << endl;
return 0;
}
그 외에 딱히 어려운 부분은 없었는데
while 부분을 살펴보면
while (1) {
if (sum >= m) { //sum이 찾으려는 값보다 크다면
ans = min(ans, e - s); //그 구간의 크기값을 갱신해준다
sum -= ar[s++];
}
else if (e == n) break;
else sum += ar[e++];
}
이런 식으로 접근하면 된다.
개인적으로 투 포인터를 활용해서 푸는 문제들은 재미있는 것 같다.
'BOJ' 카테고리의 다른 글
BOJ 2470 두 용액 (0) | 2020.10.11 |
---|---|
BOJ 7795 먹을 것인가 먹힐 것인가 (0) | 2020.10.11 |
BOJ 13414 수강 신청 (0) | 2020.10.07 |
BOJ 1059 수2 (0) | 2020.10.07 |
BOJ 11000 강의실 배정 (0) | 2020.10.02 |