이번에 풀어본 문제는
백준 20437번 문자열 게임 2 입니다.
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 = Integer.parseInt(br.readLine());
StringBuilder sb = new StringBuilder();
while (T-- > 0) {
int min = Integer.MAX_VALUE;
int max = Integer.MIN_VALUE;
String W = br.readLine();
int inputLen = W.length();
int K = Integer.parseInt(br.readLine());
if (K == 1) {
sb.append("1 1").append("\n");
continue;
}
int [] alphaCount = new int[26];
for (int i = 0; i < inputLen; i++) {
char c = W.charAt(i);
alphaCount[c - 97]++;
}
for (int i = 0; i <= inputLen - K; i++) {
char start = W.charAt(i);
if (alphaCount[start - 97] >= K) {
int tmpCount = 1;
for (int j = i + 1; j < inputLen; j++) {
char cur = W.charAt(j);
if (start == cur) {
tmpCount++;
if (tmpCount == K) {
int len = (j - i) + 1;
min = Math.min(min, len);
max = Math.max(max, len);
break;
}
}
}
}
}
if (min == Integer.MAX_VALUE || max == Integer.MIN_VALUE) {
sb.append("-1");
}
else {
sb.append(min).append(" ").append(max);
}
sb.append("\n");
}
sb.deleteCharAt(sb.length() - 1);
System.out.print(sb);
}
}
입력받은 문자열에서, 동일한 문자가 K번 반복되는 최소, 최대 단어의 길이를 출력하는 문제입니다.
각 문자의 개수를 카운트하여 K개의 이상인 경우만 탐색을 진행하면 시간을 많이 절약할 수 있습니다.
각 인덱스를 시작점으로 하여 반복 문자를 카운트하고, K개의 개수를 충족했을 때, min, max값을 누적해줍니다.
결과를 StringBuilder에 담고 결과를 출력하면 해결할 수 있습니다.
문자 개수 카운트를 추가했더니, 훨씬 효율적인 결과가 나오네요!
K가 1일때의 경우만 고려하면 쉽게 해결할 수 있습니다.