고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고양이의 언어로, 고양이의 언어를 사람의 언어로 바꾸어 주는 희대의 발명품이 될 것이다.
현재 고양이말 번역기의 베타버전이 나왔다. 그러나 이 베타버전은 완전 엉망진창이다. 베타버전의 번역기는 문자열을 주면 그 중에서 최대 N개의 종류의 알파벳을 가진 연속된 문자열밖에 인식하지 못한다. 굉장히 별로지만 그나마 이게 최선이라고 사람들은 생각했다. 그리고 문자열이 주어졌을 때 이 번역기가 인식할 수 있는 최대 문자열의 길이는 얼마인지가 궁금해졌다.
고양이와 소통할 수 있도록 우리도 함께 노력해보자.
첫째 줄에는 인식할 수 있는 알파벳의 종류의 최대 개수 N이 입력된다. (1 < N ≤ 26)
둘째 줄에는 문자열이 주어진다. (1 ≤ 문자열의 길이 ≤ 100,000) 단, 문자열에는 알파벳 소문자만이 포함된다.
첫째 줄에 번역기가 인식할 수 있는 문자열의 최대길이를 출력한다.
2
abbcaccba
4
이 문제는 슬라이딩 윈도우 같은 개념을 투 포인터를 이용해서 구현함으로서 풀 수 있었다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws Exception{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int N = Integer.parseInt(br.readLine());
String str = br.readLine();
int max = 1;
int[] check = new int[26]; //해당 알파벳 갯수 체크를 위한 배열
int cnt = 0;
int left = 0;
int right = 0;
check[str.charAt(0)-'a']++;
cnt++;
while(true) {
right++;
if(right==str.length()) break;
int num = str.charAt(right)-'a';
check[num]++;
if(check[num]==1) //알파벳이 처음 나왔다면 알파벳 종류 수 증가
cnt++;
while(cnt>N) { //알파벳 종류가 N보다 클때
int num2 = str.charAt(left) - 'a';
check[num2]--;
if(check[num2]==0) //알파벳의 갯수가 0이면 알파벳 종류 수 감소
cnt--;
left++;
}
max = Math.max(max, right-left+1);
}
System.out.println(max);
}
}