[백준/Java] 16472 고냥이

HEETAE HEO·2022년 5월 28일
0


조건

  1. 인식을 할 수 있는 알파벳의 개수가 N으로 주어진다. (1<=N<=26 , 알파벳의 개수)

  2. 두번 째에는 String이 주어지는데 문자열의 길이는 1 <= 문자열 <= 100,000

  3. 문자열에서 인식할 수 있는 개수 내에서 가장 긴 길이를 구하여라

코드

import java.io.*;
import java.util.*;



public class Main {
	
	static int N,kind;
	static String A;
	static int[] cnt;
	
	
	static FastReader scan = new FastReader();
	static StringBuilder sb = new StringBuilder();

	static void input() {
	
		N = scan.nextInt(); // 인식가능한 알파벳의 개수
		A = scan.nextLine();  // 문자열 인식
		cnt = new int[26]; // 알파벳을 구분하기 위해 'a'를 빼 배열의 인덱스  							  //값으로 구분을 한다.
	}

	static void add(char x) {
		cnt[x-'a']++; // 입력받은 x에서 -'a'를 하여 인덱스 값을 구한다.
		if(cnt[x-'a']==1) { // 처음 입력을 받는다면 kind(사용되고 있는 알파벳
			kind++;			// 의개수를 파악하기 위한 int변수)를 1증가한다.
		}
	}

	static void erase(char x) {
		cnt[x-'a']--; // 입력받은 x에서 -'a'를 하여 인덱스 값을 구한다.
		if(cnt[x-'a']==0) {
			kind--;
		}
	}
	

	static void find() {
		int len = A.length(), ans =0;
		for(int R=0,L=0;R<len;R++) {
			add(A.charAt(R)); // R을 움직이고 해당 하는 문자를 추가한다. 
			
			
			while(kind > N) { // 만약 인식할 수 있는 알파벳의 개수를 초과한다
            				  // 면 erase를 통해 L을 우측으로 한칸 이동한다.
 				erase(A.charAt(L++)); //(kind가 N과 같을 때 까지)
			}
			
			ans = Math.max(ans, R-L+1); //길이를 비교하여 가장 긴 길이를 구										// 한다.
		}
		System.out.println(ans);
	}
	

		
		
	public static void main(String[] args) {
		input();
		find();
	}
	
	static class FastReader{
		BufferedReader br;
		StringTokenizer st;
		
		public FastReader() {
			br = new BufferedReader(new InputStreamReader(System.in));
		}
		
		public FastReader(String s) throws FileNotFoundException {
			br = new BufferedReader(new FileReader(new File(s)));
		}
		
		String next() {
			while(st == null || !st.hasMoreElements()) {
				try {
					st = new StringTokenizer(br.readLine());
				} catch(IOException e) {
					e.printStackTrace();
				}
			}
			return st.nextToken();
		}
		
		int nextInt() {
			return Integer.parseInt(next());
		}
		Long nextLong() {
			return Long.parseLong(next());
		}
		double nextDouble(){
			return Double.parseDouble(next());
		}
		String nextLine() {
			String str = "";
			try {
				str = br.readLine();
			}catch(IOException e) {
				e.printStackTrace();
			}
			return str;
		}
	}
}
profile
Android 개발 잘하고 싶어요!!!

0개의 댓글