헝D의 일기장
article thumbnail

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

 

20437번: 문자열 게임 2

첫 번째 문자열에서 3번에서 구한 문자열은 aqua, 4번에서 구한 문자열은 raquator이다. 두 번째 문자열에서는 어떤 문자가 5개 포함된 문자열을 찾을 수 없으므로 -1을 출력한다.

www.acmicpc.net

나의풀이

import java.util.*;
import java.io.*;
public class Main {
    static List<Integer>[] alpha= new ArrayList[26];
    static int min= 10001, max=0 ,k=0;

    public static void main(String args[]) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int t= Integer.parseInt(st.nextToken());//게임의 개수
        
        for(int i=0; i<t; i++){
            min= 10001; max=0;
            String w= br.readLine(); //소문자로 이루어진 문자열 
            k = Integer.parseInt(br.readLine()); //양의정수 k 
            
            for(int j=0; j< 26; j++){
                alpha[j] = new ArrayList<>();
            }
            
            for(int k=0; k< w.length() ; k++){
                char temp = w.charAt(k);
                alpha[temp - 'a'].add(k); //각 알파벳이 몇번째 인덱스에 있는지
            }
            
            for(int a=0; a< 26; a++){
                if(alpha[a].size() >= k){//k보다 많이 있는 알파벳에 대해서만 투포인터 
                    twoPointer(a);
                }
            }
            
            if(min == 10001){
                bw.write("-1 \n");
            }else{
                bw.write(min+" "+max+"\n");
            }
        }
            
        bw.flush();
        br.close();
        bw.close();
        
    }
    
    public static void twoPointer(int i){
        List<Integer> list = alpha[i];//해당 알파벳이 위치한 인덱스들
        
        int start=0, end=0;
        
        while(end < list.size()){
            if(end-start+1 == k){//해당 알파벳이 딱 k개만 있을때 
                min = Math.min(min, list.get(end)-list.get(start)+1);
                max = Math.max(max, list.get(end)-list.get(start)+1);
            }
            end++;//종료점을 증가 
            while(end-start+1 > k ){//해당 알파벳이 k개보다 많으면 시작점을 증가
                start++;
            }
        }
    }
}
profile

헝D의 일기장

@헝D

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!