알고리즘
백준 20922번 겹치는 건 싫어(JAVA)
박카스마시며코딩
2024. 1. 6. 22:22
https://www.acmicpc.net/problem/20922
20922번: 겹치는 건 싫어
홍대병에 걸린 도현이는 겹치는 것을 매우 싫어한다. 특히 수열에서 같은 원소가 여러 개 들어 있는 수열을 싫어한다. 도현이를 위해 같은 원소가 $K$개 이하로 들어 있는 최장 연속 부분 수열
www.acmicpc.net
저는 투포인트를 통해 문제를 해결하였습니다.
투 포인트를 통해 그 사이에 특정 숫자들이 몇개 있는지를 확인하고 이 개수가 m를 파악합니다. 이때 m보다 크다면 startIndex를 줄여 사이 길이를 줄이면서 가장 긴 길이를 찾아 문제를 해결하였습ㄴ디ㅏ.
package BOJ.twopoint;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class BOJ_20922_3 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
st = new StringTokenizer(br.readLine());
int[] number = new int[n];
for(int i = 0 ; i < n ; i++){
number[i] = Integer.parseInt(st.nextToken());
}
int result = cal(number,n,m);
System.out.println(result);
}
private static final int SIZE = 100_000;
private static int cal(int[] numbers, int n, int m) {
int[] cnt = new int[SIZE+1];
int startIndex = 0;
int endIndex = 0;
int result = 0;
while(true){
if(endIndex >= n){
break;
}
int num = numbers[endIndex++];
cnt[num]++;
while(cnt[num] > m){
cnt[numbers[startIndex++]]--;
}
result = Math.max(result,endIndex-startIndex);
}
return result;
}
}