-
백준 20437번 문자열 게임2(자바) - 투포인터#코딩테스트 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; } } } } }
'코딩테스트' 카테고리의 다른 글
백준 18223번 민준이와 마산 그리고 건우(자바) - 다익스트라 (1) 2023.01.25 백준 2164번 카드2(자바) - 큐, 재귀 (0) 2023.01.19 백준 21921번 블로그(자바) - 슬라이딩 윈도우 (0) 2023.01.18 백준 1522번 문자열 교환(자바) - 슬라이딩 윈도우# (0) 2023.01.16 백준 2206번 벽 부수고 이동하기(자바) - bfs## (0) 2023.01.16