문제
고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고양이의 언어로, 고양이의 언어를 사람의 언어로 바꾸어 주는 희대의 발명품이 될 것이다.
현재 고양이말 번역기의 베타버전이 나왔다. 그러나 이 베타버전은 완전 엉망진창이다. 베타버전의 번역기는 문자열을 주면 그 중에서 최대 N개의 종류의 알파벳을 가진 연속된 문자열밖에 인식하지 못한다. 굉장히 별로지만 그나마 이게 최선이라고 사람들은 생각했다. 그리고 문자열이 주어졌을 때 이 번역기가 인식할 수 있는 최대 문자열의 길이는 얼마인지가 궁금해졌다.
고양이와 소통할 수 있도록 우리도 함께 노력해보자.
입력
첫째 줄에는 인식할 수 있는 알파벳의 종류의 최대 개수 N이 입력된다. (1 < N ≤ 26)
둘째 줄에는 문자열이 주어진다. (1 ≤ 문자열의 길이 ≤ 100,000) 단, 문자열에는 알파벳 소문자만이 포함된다.
출력
첫째 줄에 번역기가 인식할 수 있는 문자열의 최대길이를 출력한다.
예제 입력 1 복사
2
abbcaccba
예제 출력 1 복사
4
풀이
현재 문자열 알파벳 갯수가 최대 종류수를 넘으면 break; 아니면 계속 진행하는 방식의 투포인터를 이용해서 풀었다
import java.util.*;
import java.io.*;
class Main
{
public static void main (String[] args) throws IOException {
Scanner in = new Scanner(System.in);
int[] alphabet = new int[26];
int n = in.nextInt(), max = Integer.MIN_VALUE, cnt = 0, rt = 0, len = 0;
char[] arr = in.next().toCharArray();
for (int i = 0; i < arr.length; i++){
while (rt < arr.length && cnt <= n){
if (alphabet[arr[rt] - 97] == 0){
if (cnt == n) break;
else if (cnt < n) {
cnt++;
}
}
alphabet[arr[rt]-97] = alphabet[arr[rt]-97]+1;
rt++;
len++;
}
max = Math.max(len, max);
alphabet[arr[i] - 97] = alphabet[arr[i]-97] - 1;
if (alphabet[arr[i]-97] == 0){
cnt--;
}
len--;
}
System.out.println(max);
}
}
'자바 알고리즘 > 백준' 카테고리의 다른 글
백준 1406 : 에디터 (LinkedList, List Iterator) (0) | 2024.05.19 |
---|---|
백준 1158 : 요세푸스 문제 (0) | 2024.05.07 |
백준 14465 : 소가 길을 건너간 이유 (1) | 2024.04.29 |
백준 17609 : 회문 (투포인터) (1) | 2024.04.22 |
백준 15831 : 준표의 조약돌 (투포인터) (1) | 2024.04.21 |