728x90
자세한 풀이과정은
다음 링크에 걸어놓았습니다.
물론 파이썬으로 해결해서
코드가 조금 더 간결하고 쉽게 해결했지만,
전체적인 흐름은 똑같습니다.
1. 주어진 문자열을 반복문을 돌려서
해당 문자열이 몇 번째 인덱스에 나왔는지
저장을 합니다.
2. 인덱스 정보가 담긴 문자열 배열을 알파벳의 개수(26)만큼 반복문을 돌립니다.
3. 배열의 크기가 주어진 개수보다 작을 경우 continue
개수를 포함할 경우 인덱스 간에 거리를 구해서
min, max를 업데이트 합니다.
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
int t = Integer.parseInt(bf.readLine());
for(int i=0; i < t; i ++){
String st = bf.readLine();
int num = Integer.parseInt(bf.readLine());
solution(num,st);
}
}
public static void solution(int num,String st){
List<Integer> [] list = new ArrayList[26];
for(int i=0; i<26; i++){
list[i] = new ArrayList<>();
}
for(int i=0; i<st.length(); i++) {
int index = st.charAt(i) - 'a';
list[index].add(i);
}
int ansMin = st.length();
int ansMax = 1;
boolean flag = true;
for(List<Integer> l : list){
if(l.isEmpty() || l.size() < num) continue;
flag = false;
for(int i=0; i<= l.size() - num ; i++){
int len = l.get(i+num-1) - l.get(i) + 1;
ansMax = Math.max(ansMax,len);
ansMin = Math.min(ansMin,len);
}
}
if(flag) System.out.println(-1);
else System.out.printf("%d %d\n",ansMin,ansMax);
}
}
'Language > JAVA' 카테고리의 다른 글
[JAVA][백준 8980][그리디, 정렬] 택배 - 컴도리돌이 (0) | 2022.08.16 |
---|---|
[JAVA][백준 17845][배낭문제] 수강 과목 - 컴도리돌이 (0) | 2022.08.02 |
[JAVA][백준 12015][이분 탐색] 가장 긴 증가하는 부분 수열2 - 컴도리돌이 (0) | 2022.07.30 |
[Java][백준 2470][투 포인터] 두 용액 - 컴도리돌이 (0) | 2022.07.29 |
[JAVA][백준 2122][그리디 정렬] 센서 - 컴도리돌이 (0) | 2022.07.27 |