알고리즘
백준 16472번 고냥이 (JAVA)
박카스마시며코딩
2022. 8. 24. 14:44
https://www.acmicpc.net/problem/16472
16472번: 고냥이
고양이는 너무 귀엽다. 사람들은 고양이를 너무 귀여워했고, 결국 고양이와 더욱 가까워지고 싶어 고양이와의 소통을 위한 고양이 말 번역기를 발명하기로 했다. 이 번역기는 사람의 언어를 고
www.acmicpc.net
저는 투포인트를 이용해 문제를 해결하였습니다.
시작포인트와 끝 포인트 사이에 몇개의 알파벳 종류가 있는지를 체크하였습니다.
종류가 n개 초과한다면 시작 포인트를 늘리고 이하라면 끝 포인트를 늘려 시작 포인트와 끝 포인트의 최대 값을 찾고 리턴하였습니다.
package BOJ.twopoint;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.Set;
import java.util.function.Function;
public class BOJ_16472 {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Function<String,Integer> stoi = Integer::parseInt;
int n = stoi.apply(br.readLine());
String command = br.readLine();
int result = cal(command,n);
System.out.println(result);
}
private static final int ALPHABET_SIZE = 26;
private static int cal(String command, int n) {
int result = 0;
int si = 0;
int ei = 0;
int cnt = 0;
int[] used = new int[ALPHABET_SIZE];
while(true){
result = Math.max(result,ei-si);
if(ei >= command.length()){
break;
}
int now = command.charAt(ei) - 'a';
if(used[now] > 0 || cnt < n){
if(used[now] == 0){
cnt++;
}
used[now]++;
ei++;
continue;
}
if(cnt >= n){
int prev = command.charAt(si) - 'a';
used[prev]--;
if(used[prev] == 0){
cnt--;
}
si++;
continue;
}
}
return result;
}
}