https://www.acmicpc.net/problem/20437
초반에 너무 복잡한 방식으로 접근하여 애를 먹었던 문제였다. 결국 문제에서 주어진 조건을 만족하는 문자열은 특정 문자를 개만 포함한다. 이 조건에 집중하여 다음 전개로 로직을 구성하였다.
개 이상 포함된 문자들만을 대상으로 문자열 내에서 탐색을 진행하기 때문에 실질적인 로직의 시간 복잡도는 로 수렴한다. 따라서 인 최악의 경우에도 무난히 1초의 제한 조건을 통과할 수 있다.
import static java.lang.Integer.*;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int T = parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
while (T-- > 0) {
String line = br.readLine();
int K = parseInt(br.readLine());
if (K == 1) {
sb.append("1 1")
.append("\n");
continue;
}
int[] alphabet = new int[26];
line.chars()
.forEach(c -> alphabet[c - 'a']++);
int minLength = MAX_VALUE;
int maxLength = MIN_VALUE;
for (int i = 0; i < line.length(); i++) {
char letter = line.charAt(i);
if (alphabet[letter - 'a'] < K)
continue;
int count = 1;
for (int j = i + 1; j < line.length(); j++) {
if (line.charAt(j) != letter)
continue;
count++;
if (count == K) {
minLength = Math.min(minLength, j - i + 1);
maxLength = Math.max(maxLength, j - i + 1);
break;
}
}
}
if (minLength == MAX_VALUE || maxLength == MIN_VALUE) {
sb.append("-1").append("\n");
continue;
}
sb.append(minLength)
.append(" ")
.append(maxLength)
.append("\n");
}
System.out.println(sb);
br.close();
}
}