본문 바로가기

알고리즘 관련/BOJ

20922 겹치는 건 싫어

www.acmicpc.net/problem/20922

 

20922번: 겹치는 건 싫어

홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 $K$개 이하로 들어 있는 최장 연속 부분 수열

www.acmicpc.net

투포인터라는 방법을 응용하면 쉽게 풀 수 있는 문제이다.

접근은 다음과 같다.

맵을 이용하여 중복을 체크한다.

1. 탐색의 처음 부분을 두 개의 포인터가 가리킨다.

2. 끝 부분의 포인터가 이동하면서 중복 개수가 K개를 초과하면, 시작 부분의 포인터를 다음으로 이동시키고 해당 값을 한 개 줄인다.

3. K개 이하가 될 때까지 2를 반복한다.

4. 배열의 길이 N까지 탐색을 마치면 종료한다.

 

고찰 : 놓쳤던 부분은 K개를 초과하면 이전에 저장했던 모든 정보들을 다 날려버렸기 때문에 틀렸었다. 따라서 맨 앞에서 찾았던 정보를 하나씩 지우면서 접근해야 올바른 방법이다.

정답코드

#include <iostream>
#include <unordered_map>
#include <vector>
#include <algorithm>
using namespace std;
unordered_map<int, int> um;
int N, K;
int main()
{
	cin >> N >> K;
	vector<int> v(N, 0);
	for (int i = 0; i < N; i++)
		scanf("%d", &v[i]);
	int s = 0, e = 0;
	int answer = 0, len = 0;
	while (e < N) {
		int num = v[e];
		um[num]++;
		if (um[num] > K) {
			um[num]--;
			um[v[s]]--;
			s++;
		}
		else {
			e++;
			len = e - s;
			answer = max(len, answer);
		}
	}
	printf("%d\n", answer);
	return 0;
}

'알고리즘 관련 > BOJ' 카테고리의 다른 글

20152 Game Addiction  (0) 2021.06.15
1655 가운데를 말해요  (0) 2021.04.28
17472 다리 만들기 2  (0) 2021.03.22
16235 나무 재테크  (0) 2021.03.22
1, 2, 3 더하기 시리즈  (0) 2021.03.18