PS (C, C++)

[백준/C & C++] 21921 블로그

최연재 2023. 1. 24. 17:09

https://www.acmicpc.net/problem/21921

 

21921번: 블로그

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

www.acmicpc.net

C

#include <stdio.h>

int daysum[250001];

int main()
{
	int x, n, result,max, cnt=1, day;
	scanf("%d %d", &n, &x);

	scanf("%d", &day);
	daysum[0] = day;

	for (int i = 1; i < n; i++)
	{
		scanf("%d", &day);
		daysum[i] = day + daysum[i - 1];
	}

	max=result = daysum[x - 1];
	for (int i = x; i < n; i++)
	{
		result = daysum[i] - daysum[i-x];
		if (max < result)
		{
			max = result;
			cnt = 1;
		}
		else if (max == result) cnt++;
	}
	if (max == 0) printf("SAD");
	else printf("%d\n%d", max, cnt);
	return 0;
}

C++

#include <iostream>
using namespace std;

int daysum[250001];

int main()
{
	int n, x, result, max, cnt = 1, day;
	cin >> n >> x;
	cin >> day;
	daysum[0] = day;

	for (int i = 1; i < n; i++)
	{
		cin >> day;
		daysum[i] = day + daysum[i - 1];
	}

	max=result = daysum[x - 1];
	for (int i = x; i < n; i++)
	{
		result = daysum[i] - daysum[i - x];
		if (max < result)
		{
			max = result;
			cnt = 1;
		}
		else if (max == result) cnt++;
	}

	if (max == 0) cout << "SAD";
	else cout << max << "\n" << cnt;
	return 0;
}

코드 설명

daysum[i]은 0~i번째 날까지의 방문자 수를 저장한다 ->  x일동안의 방문자 수는 daysum[i]-daysum[i-x]가 된다.

이를 이용해서 코드를 작성했다. 여기서 하루하루의 값은 배열로 저장할 필요가 없다.

 

첫날의 값만 반복문 밖에서 입력받아 daysum[0]에 대입한다.

이후 반복문을 돌면서 i번째 날의 수를 입력받고 daysum[i]은 daysum[i-1]+day의 값을 대입한다.

 

범위를 충족시키는 첫 번째 값은 daysum[x-1]이니 이를 max에 저장한다. cnt에는 현재 1이 저장되어 있다.

반복문을 돌면서 범위를 충족하는 값을 구하고 이를 max와 비교한다. result가 max보다 크다면 max에 result를 대입하고, cnt를 1로 한다. 같은 경우에는 cnt를 1씩 증가시킨다.

 

max가 0일 경우 최대 방문자 수가 0인 것이므로 SAD를 출력하고, 그렇지 않을 경우 최댓값과 최댓값이 등장한 횟수를 줄을 바꿔 출력하고 프로그램을 종료한다.

 

느낀 점

처음에는 중첩반복문을 써서 문제를 풀었는데 시간초과가 됐다. 당시에는 해결할 방안을 생각하지 못했는데, 오늘 방법이 떠올라서 바로 풀었다. 위의 코드들로 풀고 코드를 더 간결하게 줄여서 제출했다가 틀렸다. 지금의 내가 할 수 있는 최선의 코드인 것 같다.