[BOJ-Code] 20922 - 겹치는 건 싫어

Posted by DHniyeo Blog on August 16, 2024

문제 링크

💡 두 포인터

Memory 3588KB Time 72ms Code Length 645B

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
32
33
34
35
36
37
38
39
40
41
42
#include<iostream>
#include<queue>
using namespace std;

int mem[100001];
int num;
int max_cnt;
int result;
queue<int> q;
int arr[200000];

void init() {
	cin >> num;
	cin >> max_cnt;
	for (int i = 0; i < num; i++) {
		cin >> arr[i];
	}
}
void solve() {
	for (int i = 0; i < num; i++) {
		mem[arr[i]]++;
		if (mem[arr[i]] > max_cnt) { // 해당 카운트를 넘으면
			while (mem[arr[i]] > max_cnt) { // 
				int front = q.front(); q.pop();
				mem[front]--;
			}
		}
		q.push(arr[i]); // push
		result = result < q.size() ? q.size() : result;

	}


}
void result_print() {
	cout << result;
}
int main() {
	init();
	solve();
	result_print();
}

init 함수에서는 사용자로부터 숫자와 최대 카운트를 입력받고 배열 arr에 숫자들을 저장한다. solve 함수에서는 배열 arr의 각 숫자를 순회하면서 해당 숫자의 등장 횟수를 카운트하고, 만약 최대 카운트를 초과하면 해당 숫자가 최대 카운트를 초과할 때까지 큐에서 숫자를 빼내고 카운트를 감소시킨다. 그리고 큐에 해당 숫자를 push하고 현재 큐의 사이즈와 result 값을 비교하여 더 큰 값을 result에 저장한다. result_print 함수에서는 result 값을 출력한다. main 함수에서는 init 함수를 호출하여 입력을 받고, solve 함수를 호출하여 문제를 해결하고, result_print 함수를 호출하여 결과를 출력한다.