티스토리 뷰

백준/실버

[백준 21921번] 블로그 (C++)

게임개발기원 2023. 7. 15. 14:56

문제링크 : https://www.acmicpc.net/problem/21921

 

21921번: 블로그

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

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

int arr[250001];
int arr_sum[250001];

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    int N, X, sum = 0, maxV = 0;
    cin >> N >> X;

    for(int i=1; i<=N; i++)
    {
        cin >> arr[i];
        sum += arr[i];
        arr_sum[i] = sum; //누적합
    }

    int cnt = 1; //구간 최소 길이 1
    for(int i=X; i<=N; i++)
    {
        int sum_tmp = arr_sum[i] - arr_sum[i-X]; //각 구간 합
        if(maxV < sum_tmp) //최대 구간 갱신
        {
            maxV = sum_tmp;
            cnt = 1;
        }
        else if(maxV == sum_tmp) cnt++; //최대 구간 갯수 갱신
    }

    if(maxV==0) cout <<"SAD";
    else cout << maxV <<'\n' << cnt;

    return 0;
}

각 구간에 대한 누적합을 저장하고 시작한다.

X의 길이만큼의 누적 합들을 확인하는데, 최대 구간 합을 따로 저장하고, 최대 구간 합이 새롭게 나타난 것이라면 해당 구간 합의 갯수도 다시 카운팅해야 하므로 cnt = 1로 만든다.

이후 갱신했던 최대 구간 합과 똑같은 값이 나온다면 최대 구간 합의 갯수가 증가한 것이므로 cnt를 증가시켜준다.

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/08   »
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
글 보관함