https://www.acmicpc.net/problem/2559
<풀이>
1. 숫자 N개 중 K개의 합을 처음부터 끝까지 모두 확인해보고 최댓값을 갱신한다.
<해법>
1. 배열 처음~끝까지 K개의 합을 비교하는 방법
=> 투 포인터 활용한다. 부분집합1에서 부분집합2를 구할 때, 양쪽 끝 값은 변화하고 가운데 값은 변하지 않기 때문이다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
|
#include <iostream>
using namespace std;
const int MAX = 100000 + 1;
int arr[MAX];
long long int res;
int main() {
int N, K;
//입력
cin >> N >> K;
for (int i = 0; i < N; i++) {
cin >> arr[i];
}
//초기 배열1 설정
int s = 0;
long long int sum = 0;
for (int i = s; i < s+K; i++) {
sum += arr[i];
}
res = sum;
//배열 탐색
while (true) {
//기존 합에 앞에 부분을 뺀다
sum -= arr[s];
//배열의 범위를 벗어날 경우
if (s+K >= N) {
break;
}
//합에 뒷부분을 더한다
sum += arr[s+K];
if (sum > res) {
res = sum;
}
//다음 배열 index
s++;
}
//출력
cout << res;
}
|
투포인터에 대해 알아볼 수 있는 문제였습니다.
'알고리즘 문제풀이 > 백준' 카테고리의 다른 글
[C++] 백준 1992 - 쿼드트리 (0) | 2020.04.27 |
---|---|
[C++] 백준 2436 - 공약수 (0) | 2020.04.27 |
[C++] 백준 2467 - 용액 (0) | 2020.04.27 |
[C++] 백준 2468 - 안전 영역 (0) | 2020.04.27 |
[C++] 백준 2469 - 사다리 타기 (0) | 2020.04.27 |