본문 바로가기

Language/JAVA

[JAVA][백준 20437][문자열] 문자열 게임 2 - 컴도리돌이

728x90

 

 

20437번: 문자열 게임 2

첫 번째 문자열에서 3번에서 구한 문자열은 aqua, 4번에서 구한 문자열은 raquator이다. 두 번째 문자열에서는 어떤 문자가 5개 포함된 문자열을 찾을 수 없으므로 -1을 출력한다.

www.acmicpc.net


 

자세한 풀이과정은 

다음 링크에 걸어놓았습니다.

 

물론 파이썬으로 해결해서 

코드가 조금 더 간결하고 쉽게 해결했지만,

전체적인 흐름은 똑같습니다.

 

1. 주어진 문자열을 반복문을 돌려서 

해당 문자열이 몇 번째 인덱스에 나왔는지

저장을 합니다.

 

2. 인덱스 정보가 담긴 문자열 배열을 알파벳의 개수(26)만큼 반복문을 돌립니다.

 

3. 배열의 크기가 주어진 개수보다 작을 경우 continue

개수를 포함할 경우 인덱스 간에 거리를 구해서

min, max를 업데이트 합니다.

 

 

 

[Python][백준 20437][문자열] 문자열 게임 2 - 컴도리돌이

풀이과정 해당 문제는 시간 초과를 걸리 줄 알았는데, 생각보다 쉽게 해결되어서 허무(?)했던 문제였다. (원래 시간 초과 4개 걸리고 해결해야 짜릿한데,,🙄🙄) 1. 입력받은 w를 enumerate로 인덱스

comdolidol-i.tistory.com


import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));

        int t = Integer.parseInt(bf.readLine());

        for(int i=0; i < t; i ++){

            String st = bf.readLine();
            int num = Integer.parseInt(bf.readLine());
            solution(num,st);
        }
    }

    public static void solution(int num,String st){

        List<Integer> [] list = new ArrayList[26];

        for(int i=0; i<26; i++){
            list[i] = new ArrayList<>();
        }
        for(int i=0; i<st.length(); i++) {
            int index = st.charAt(i) - 'a';
            list[index].add(i);
        }
        int ansMin = st.length();
        int ansMax = 1;
        boolean flag = true;
        for(List<Integer> l : list){
            if(l.isEmpty() || l.size() < num) continue;
            flag = false;
            for(int i=0; i<= l.size() - num ; i++){
                int len = l.get(i+num-1) - l.get(i) + 1;
                ansMax = Math.max(ansMax,len);
                ansMin = Math.min(ansMin,len);
            }
        }

        if(flag) System.out.println(-1);
        else System.out.printf("%d %d\n",ansMin,ansMax);
    }
}