코딩테스트/백준

[백준 - 16472] 고냥이 .java

머밍 2025. 5. 27. 17:24

https://www.acmicpc.net/problem/16472

  • 최대 N개의 종류의 알파벳을 가진 연속된 문자열만 인식
  • 문자열이 주어졌을 때 이 번역기가 인식할 수 있는 최대 문자열의 길이 구하기
  • 단, 문자열에는 알파벳 소문자만이 포함
  • 번역기가 인식할 수 있는 문자열의 최대길이를 출력

 

 

getCount(int[] alp)

 

현재 창(window)에 포함된 서로 다른 알파벳의 개수를 반환

alp 배열: 각 알파벳 등장 빈도 -> 크기 26

 

 

투포인터

 

: 현재까지 포함된 알파벳 종류는 n개 이하 

-> 다음 알파벳 검사 (next)

 

next가 문자열 범위에 있을 때,

다음 알파벳을 추가하여 종류 개수 검사

n보다 크면 next가지말고 -> 한칸 뒤로, 추가했던 빈도 되돌리기 -> 더이상 증가 불가

=> i 증가 -> 현재 i 빈도 제거 후 이동

이때 정답은 최댓값 갱신

 

 

 

import java.util.*;


public class test1 {
    //현재 문자열에 속한 알파벳 종류 구하는 함수
    public static int getCount(int[] alp){
        int type =0;
        for(int i=0;i<alp.length;i++){
            if(alp[i]>0) type++;
        }
        return type;

    }
    public static void main(String[] args)  {
        Scanner sc = new Scanner(System.in);

        int n= sc.nextInt();
        char[] str = sc.next().toCharArray();

        int[] alpFre = new int[26];
        int next = 0, answer =0;
        for(int i =0; i<str.length;i++){
            while(next<str.length){
                //다음 알파벳 넣기
                alpFre[str[next++] -'a']++;
                //다음 알파벳 추가 안됨
                if(getCount(alpFre) > n){
                    //증가한거 취소
                    alpFre[str[--next] -'a']--;
                    break;//다음 i로 넘어가야
                }
            }
            //next는 포함안됨
            answer = Math.max(answer, next-i);
            //i빼기
            alpFre[str[i] -'a']--;
        }
        System.out.println(answer);
    }

}