알고리즘/백준 BOJ
[ BOJ/C# ] 21921 블로그
왹져박사
2023. 8. 29. 22:54
https://www.acmicpc.net/problem/21921
21921번: 블로그
첫째 줄에 $X$일 동안 가장 많이 들어온 방문자 수를 출력한다. 만약 최대 방문자 수가 0명이라면 SAD를 출력한다. 만약 최대 방문자 수가 0명이 아닌 경우 둘째 줄에 기간이 몇 개 있는지 출력한다
www.acmicpc.net
누적합들을 슬라이딩 윈도우 개념을 이용하여 구하고 비교하는 문제였다.
이중 for문을 사용하면 시간초과가 되어 최초의 누적 합을 구한 뒤, 이전값을 빼주고 다음값을 더해주도록 하였다.
using System;
namespace _21921
{
class Program
{
static void Main()
{
StreamReader sr = new StreamReader(Console.OpenStandardInput());
StreamWriter sw = new StreamWriter(Console.OpenStandardOutput());
String[] str = sr.ReadLine().Split(' ');
String[] dayStr = sr.ReadLine().Split(' ');
int n = int.Parse(str[0]);
int x = int.Parse(str[1]);
int[] days = new int[n];
for(int i = 0; i < n; i++)
{
days[i] = int.Parse(dayStr[i]);
}
int max = 0; //최대방문자 수
int count = 1; //기간 수
int sum = 0;
for (int i = 0; i <= n - x; i++)
{
//첫 x일간의 누적 방문 수(누적 합)
if(i == 0)
{
for (int j = 0; j < x; j++)
{
sum += days[j];
}
}
else
{
//슬라이딩 윈도우
sum = sum - days[i - 1] + days[i + x - 1];
}
if (sum > max)
{
max = sum;
count = 1;
}
else if (sum == max) count++;
}
if (max == 0) sw.WriteLine("SAD");
else
{
sw.WriteLine("{0}\n{1}", max, count);
}
sr.Close();
sw.Flush();
sw.Close();
}
}
}