https://www.acmicpc.net/problem/2559
2559번: 수열
첫째 줄에는 두 개의 정수 N과 K가 한 개의 공백을 사이에 두고 순서대로 주어진다. 첫 번째 정수 N은 온도를 측정한 전체 날짜의 수이다. N은 2 이상 100,000 이하이다. 두 번째 정수 K는 합을 구하기
www.acmicpc.net
문제 해결 과정
착안
$n$ 번째 숫자 $a_n$ 부터 $(n+K-1)$ 번째 숫자 $a_{n+K-1}$ 까지 연속된 $K$ 개의 숫자를 더한 값을 $S_n$ 이라고 하면,
$$S_{n+1} = S_n + a_{n+K} - a_n \quad(n \geq 1,\space 2 \leq K \leq N)$$
이므로, 이전 단계의 합의 값을 알면 숫자 두 개만 더하고 뺌으로써 다음 번째의 연속합을 계산할 수 있으므로 $K$ 개의 연속된 숫자의 합을 구하는 시간 복잡도를 동적계획법(dynamic programming)을 통해 낮추고자 하였다.
구현
[스포 주의] 아래 '더보기'를 누르면 코드가 나오니 주의하세요~
더보기
#include <iostream>
using namespace std;
int Degrees[100000];
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int N, K;
cin >> N >> K;
for (int i = 0; i < N; i++)
cin >> Degrees[i];
int sum = 0;
for (int i = 0; i < K; i++)
sum += Degrees[i];
int max = sum;
for (int i = 1; i <= N - K; i++)
{
sum += Degrees[K + i - 1] - Degrees[i - 1];
if (sum > max)
max = sum;
}
cout << max << "\n";
return 0;
}
실행 결과
'C++ 코딩 문제 풀이 > 백준' 카테고리의 다른 글
[Baekjoon] 1931번: 회의실 배정 (0) | 2023.06.21 |
---|---|
[Baekjoon] 10844번: 쉬운 계단 수 (0) | 2023.06.20 |
[Baekjoon] 1966번: 프린터 큐 (0) | 2023.06.17 |
[Baekjoon] 9663번: N-Queen (0) | 2023.06.16 |
[Baekjoon] 1463번: 1로 만들기 (0) | 2023.06.15 |
댓글