[백준 실버3] 21921 : 블로그

수민이슈·2023년 10월 4일
0

[C++] 코딩테스트

목록 보기
81/116
post-thumbnail

🖊️ 문제

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


🖊️ 풀이

투포인터..

0부터 N-1까지 쭉 방문할건데,
front, rear 포인터 2개를 이용해서 방문한다.

먼저 frontfront - rearx-1이 될 때까지 계속 증가해주며 부분합에 더해준다.
(front - rear = 방문 기간)

front - rear == x-1이 된 순간,
이전 방문자수와 비교해주고, 또 front값을 증가해준다.

방문기간을 초과하면 부분합에서 현재rear값을 빼주고, rear를 증가해준다.

이렇게 계속 조건에 따라 해주면 된당.

while 조건을 잘못 넣어서 몇 분 잡아먹었지만 그래두 낫밷 ,,

문제가 쉽긴하지만,, 1트만에 성공해서 뿌듯 ^_^ 역시 난 실딱이었다 .. . ..

#include <iostream>
using namespace std;

int arr[250'001];

int main()
{
	int n, x;
	cin >> n >> x;

	for (int i = 0; i < n; i++)
		cin >> arr[i];

	int front = 0;
	int rear = 0;
	int visitor = 0;
	int cnt = 0;
	int sum = arr[rear];
	while (front < n && rear <= n - x) {
		if (front - rear == x - 1) {
			if (sum == visitor) ++cnt;
			if (sum > visitor) {
				visitor = sum;
				cnt = 1;
			}
			sum += arr[++front];
		}
		else if (front - rear < x - 1) {
			sum += arr[++front];
		}
		else {
			sum -= arr[rear++];
		}
	}
	
	if (visitor == 0) cout << "SAD" << endl;
	else cout << visitor << endl << cnt << endl;
}

0개의 댓글