코딩테스트
백준 20437번 문자열 게임2(자바) - 투포인터#
leeeehhjj
2023. 1. 19. 16:38
문자열 게임 2
시간 제한메모리 제한제출정답맞힌 사람정답 비율
1 초 | 1024 MB | 2497 | 1088 | 801 | 42.629% |
문제
작년에 이어 새로운 문자열 게임이 있다. 게임의 진행 방식은 아래와 같다.
- 알파벳 소문자로 이루어진 문자열 W가 주어진다.
- 양의 정수 K가 주어진다.
- 어떤 문자를 정확히 K개를 포함하는 가장 짧은 연속 문자열의 길이를 구한다.
- 어떤 문자를 정확히 K개를 포함하고, 문자열의 첫 번째와 마지막 글자가 해당 문자로 같은 가장 긴 연속 문자열의 길이를 구한다.
위와 같은 방식으로 게임을 T회 진행한다.
입력
문자열 게임의 수 T가 주어진다. (1 ≤ T ≤ 100)
다음 줄부터 2개의 줄 동안 문자열 W와 정수 K가 주어진다. (1 ≤ K ≤ |W| ≤ 10,000)
출력
T개의 줄 동안 문자열 게임의 3번과 4번에서 구한 연속 문자열의 길이를 공백을 사이에 두고 출력한다.
만약 만족하는 연속 문자열이 없을 시 -1을 출력한다.
예제 입력 1 복사
2
superaquatornado
2
abcdefghijklmnopqrstuvwxyz
5
예제 출력 1 복사
4 8
-1
첫 번째 문자열에서 3번에서 구한 문자열은 aqua, 4번에서 구한 문자열은 raquator이다.
두 번째 문자열에서는 어떤 문자가 5개 포함된 문자열을 찾을 수 없으므로 -1을 출력한다.
예제 입력 2 복사
1
abaaaba
3
예제 출력 2 복사
3 4
import java.util.Scanner;
public class Main {
static int max, min;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int t = sc.nextInt();
while (t--> 0) {
max = Integer.MIN_VALUE;
min = Integer.MAX_VALUE;
String str = sc.next();
int[] alpha = new int[26];
for (int i = 0; i < str.length(); i++) {
alpha[str.charAt(i) - 'a']++;
}
int k = sc.nextInt();
if (k==1) {
System.out.println("1 1");
continue;
}
twoPointer(str, alpha, k);
if (min == Integer.MAX_VALUE || max == Integer.MIN_VALUE) {
System.out.println(-1);
}
else System.out.println(min + " " + max);
}
}
static void twoPointer(String str, int[] alpha, int k) {
for (int i = 0; i < str.length() - k + 1; i++) {
char now = str.charAt(i);
if (alpha[now - 'a'] < k) continue;
int cnt = 1;
for (int j = i+1; j < str.length(); j++) {
if (now == str.charAt(j)) cnt++;
if (cnt == k) {
min = Math.min(min, j-i+1);
max = Math.max(max, j-i+1);
alpha[now - 'a']--;
break;
}
}
}
}
}