카테고리 없음
백준 - 문자열 게임 2 (20437); Java
thegreatjy
2023. 6. 30. 17:02
728x90
https://www.acmicpc.net/problem/20437
20437번: 문자열 게임 2
첫 번째 문자열에서 3번에서 구한 문자열은 aqua, 4번에서 구한 문자열은 raquator이다. 두 번째 문자열에서는 어떤 문자가 5개 포함된 문자열을 찾을 수 없으므로 -1을 출력한다.
www.acmicpc.net
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
int T = Integer.parseInt(br.readLine());
for(int i=0;i<T;i++) {
String W = br.readLine();
int K = Integer.parseInt(br.readLine());
int min = 10001, max = 0;
ArrayList<ArrayList<Integer>> list = new ArrayList<ArrayList<Integer>>();
for(int a=0;a<26;a++) {
list.add(new ArrayList<>());
}
//W 탐색
for(int j=0;j<W.length();j++) {
int unicode = W.charAt(j) - 97;
list.get(unicode).add(j);
//어떤 알파벳(W[j])가 K번 나왔을 때 연속 문자열 길이를 구한다
int size = list.get(unicode).size();
if(size >= K) {
int start = list.get(unicode).get(size - K);
int end = list.get(unicode).get(size-1);
int len = end - start + 1;
if(len<min) {
//System.out.println("min: "+end+" "+start);
min = len;
}
if(len>max) {
//System.out.println("max: "+end+" "+start);
max = len;
}
}
}
if(min==10001) {
sb.append("-1\n");
continue;
}
sb.append(min+" "+max+"\n");
}
System.out.println(sb.toString());
}
}
각 문자마다 LinkedList<Integer>를 만들어줘서 문자가 나온 위치(idx)를 저장해준다. (Queue로 해도 될 듯)
현재 위치의 문자를 해당 문자의 LinkedList에 추가하고, 그 리스트 개수가 K개가 넘으면 탐색을 한다.
현재위치에서 K개 전~현재위치까지의 길이를 구한다.
나오지 않는 문자까지 LinkedList를 만들어주어서 메모리 소비가 크다.. ㅜ
728x90