본문 바로가기
알고리즘 문제 풀이/백준

백준 21921 블로그 c++ (누적 합)

by 옹구스투스 2021. 12. 21.
반응형

문제 출처 : https://www.acmicpc.net/problem/21921

 

21921번: 블로그

첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다

www.acmicpc.net

문제

찬솔이는 블로그를 시작한 지 벌써 N일이 지났다.

요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.

찬솔이는 X일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.

찬솔이를 대신해서 X일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.

입력

첫째 줄에 블로그를 시작하고 지난 일수 N와 X가 공백으로 구분되어 주어진다.

둘째 줄에는 블로그 시작 1일차부터 N일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.

출력

첫째 줄에 X일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.

만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.

제한

  •  1≤X≤N≤250,000
  •  0≤방문자 수 ≤8,000 

알고리즘 분류

풀이

누적 합 기본 문제이다.

0일부터 x일 동안의 합을 미리 구해놓고,

이후 0+i일부터 x+i일 까지의 합으로 최대 방문자 수를 갱신하면 된다.

동시에 최대 방문자 수가 갱신되었다면, 그때부터 최대 방문자 수가 몇 번 나왔는지 카운트해주면 된다.

누적 합에서 3~5일까지의 합을 sum이라 할 때,

4~6일까지의 합은 sum -3일 + 6일이다.

 

코드

#include <iostream>

using namespace std;

int main() {

	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);

	int n, x;
	cin >> n >> x;
	int sum = 0;
	int arr[250000];
	for (int i = 0; i < x; i++) {
		cin >> arr[i];
		sum += arr[i];
	}
	int answer = sum;
	int cnt = 1;
	for (int i = x; i < n; i++) {
		cin >> arr[i];
		sum += arr[i] - arr[i - x];
		if (sum >= answer) {
			if (sum == answer) {
				cnt++;
			}
			else {
				answer = sum;
				cnt = 1;
			}
		}
	}
	if (answer == 0) {
		cout << "SAD";
	}
	else
		cout << answer << '\n' << cnt;
	return 0;
}
반응형

댓글