백준 2559 수열 ❗

CJB_ny·2022년 12월 30일
0

백준

목록 보기
29/104
post-thumbnail

수열

화나서 코드만 조금 바꾸고 계속 제출 해봄..

"문제"에서 "최대값"구하라고하면은 최소값부터 구하고

"문제"에서 "최소값"을 구하라고 하면은 "최대값"부터 구해야한다.

이문제에서의 최소값은

-1000만이다. 이것을 잡고 들어가야한다.

내가 제출한 코드는

#include <stdlib.h>
#include <iostream>
#include <algorithm>
using namespace std;

#define MAX 100000
int day, add;
int de[MAX];

int main() 
{
	cin >> day >> add;
	
	for (int i = 0; i < day; ++i)
		cin >> de[i];
	
	int c = 0;
	int sum = 0;
	int Max = 0;
	for (int i = 0; i < day; ++i)
	{
		for (int j = 0; j < add; ++j)
		{
			sum += de[i + c++];
		}
		c = 0;
		Max = max(Max, sum);
		sum = 0;
	}
	
	cout << Max << "\n";
	
	system("pause");
	return 0;
}

코드가 더럽고 길다..

결론은 사실 "누적합"이였다.

후기 및 분석

그냥 아직 나는 너무 못한다

최대 최소값 잡는 부분부터 "누적합"구하는 부분 코드 이해하는 과정도 그렇고 생각을 잘 안하는듯 현재는

일단 계속 안되었던 부분이 배열 인덱스 범위 넘어가는 부분이였음

누적합 배열은 있는데 이곳에서 어떻게 -m 번째까지의 누적합값만 추출을 할지를 감을 못잡음
이것을 예로 들자면

for (int i = m; i <= n; ++i)
{
	ret = max(ret, psum[i] - psum[i - m]);
}

위의 코드임

cpp 코드

#include <iostream>
#include <string>
#include <map>
using namespace std;
#define endl "\n";

typedef long long ll;
int n, m, k;
ll ret = -10000001;
ll psum[100004];

int main()
{
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cout.tie(NULL);

	cin >> n >> m;
	
	for (int i = 1; i <= n; ++i)
	{
		cin >> k;
		psum[i] = psum[i - 1] + k;
	}

	for (int i = m; i <= n; ++i)
	{
		ret = max(ret, psum[i] - psum[i - m]);
	}

	cout << ret << endl;

	return 0;
}
profile
https://cjbworld.tistory.com/ <- 이사중

0개의 댓글