BOJ
[ BOJ / C++ ] 21921번 : 블로그
J_3s
2025. 3. 30. 16:41
[ BOJ ] 21921번 : 블로그
문제 : https://www.acmicpc.net/problem/21921
[ 문제 ]
찬솔이는 블로그를 시작한 지 벌써 일이 지났다.
요즘 바빠서 관리를 못 했다가 방문 기록을 봤더니 벌써 누적 방문 수가 6만을 넘었다.
찬솔이는 일 동안 가장 많이 들어온 방문자 수와 그 기간들을 알고 싶다.
찬솔이를 대신해서 일 동안 가장 많이 들어온 방문자 수와 기간이 몇 개 있는지 구해주자.
[ 입력 ]
첫째 줄에 블로그를 시작하고 지난 일수 가 공백으로 구분되어 주어진다.
와둘째 줄에는 블로그 시작 일차부터 일차까지 하루 방문자 수가 공백으로 구분되어 주어진다.
[ 출력 ]
첫째 줄에 일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다.
만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다.
[ 제한 ]
- 방문자 수
[ 문제 접근 및 풀이 ]
$X$가 25만이고, 방문자 수가 8천명이라고 가정했을 때
최댓값은 20억으로 int형의 최댓값은 21억 정도로 넘지 않는다.
투 포인터(Two-Pointer) 알고리즘으로 1일부터 X일동안 들어온 방문자를 psum 변수에 넣어주고
1일차 ~ X일차 , 2일차 ~ X+1일차, 3일차 ~ X+2일차 ...의 값을 구하면서
최댓값을 넘는다면 Maxvalue값을 바꿔주며 Maxcnt를 1로 바꾸어준다.
또한 최댓값과 같다면 기간을 1일 추가한다.
[ 소스 코드 ]
#include<bits/stdc++.h>
using namespace std;
int X,N,Maxvalue=0,Maxcnt=0;
int arr[250001];
void Q_21921();
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
Q_21921();
}
void Q_21921(){
cin >> N >> X;
for(int i=0;i<N;i++){
cin >> arr[i];
}
int st=0,ed=X-1,psum=0;
for(int i=0;i<X;i++)psum+=arr[i];
while(ed<N){
if(Maxvalue<psum){
Maxvalue=psum;
Maxcnt=1;
}
else if(Maxvalue==psum) Maxcnt++;
psum-=arr[st++];
psum+=arr[++ed];
}
if(!Maxvalue) cout<<"SAD";
else cout << Maxvalue << "\n" << Maxcnt;
}