Algorithm/백준

[백준] 2559 with C++

nowkoes 2023. 2. 27. 16:43

문제설명


입출력 예제


개념

 특정 구간까지의 수열의 합을 구하는 문제다. 단순히 반복문을 중첩시켜 결괏값을 얻으려 하면 십중팔구 시간초과에 걸린다. 이러한 문제처럼 연속된 값을 더하는 문제를 풀 땐 구간합 개념을 이용하면 쉽게 해결할 수 있다.

 

구간합(Prefix Sum)

- 수열에서 특정 구간의 합 


풀이

#include <iostream>
using namespace std;

int N, K, temp, sum[100001], ret = -2147483647;

int main() 
{
	cin >> N >> K;

 온도를 측정한 전체 날짜의 수 N, 합을 구하기 위한 연속적인 날짜의 수 K, 구간합을 구할 배열 sum, 구간합 배열의 최솟값 변수 ret을 초기화한다. 이때 ret의 값은 int의 최솟값이다.

 

	for (int i = 1; i <= N; i++)
	{
		cin >> temp;
		sum[i] = sum[i - 1] + temp; // 구간합 배열
	}
	
	for (int i = K; i <= N; i++)
	{
		ret = max(ret, (sum[i] - sum[i - K]));
	}

	cout << ret;

 매일 측정한 온도 temp를 초기화해 주고, 값을 더할 때마다 구간합 배열 sum을 초기화시켜 준다. 그리고 결괏값 ret을 다시 초기화해 주면 된다. 이 과정을 시각적으로 확인해 보면 다음과 같다.

 

 

총합본

#include <iostream>
using namespace std;

int N, K, temp, sum[100001], ret = -2147483647;

int main() 
{
	cin >> N >> K;

	for (int i = 1; i <= N; i++)
	{
		cin >> temp;
		sum[i] = sum[i - 1] + temp; // 구간합 배열
	}
	
	for (int i = K; i <= N; i++)
	{
		ret = max(ret, (sum[i] - sum[i - K]));
	}

	cout << ret;
}

 

반응형

'Algorithm > 백준' 카테고리의 다른 글

[백준] 25206 with C++  (0) 2023.04.05
[백준] 2563 with C++  (0) 2023.04.02
[백준] 9375 with C++  (0) 2023.02.24
[백준] 1065 with C++  (0) 2023.02.23
[백준] 1620 with C++  (0) 2023.02.22