백준 20437 문자열 게임 2 (Java,자바)

jonghyukLee·2022년 11월 5일
0

이번에 풀어본 문제는
백준 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일때의 경우만 고려하면 쉽게 해결할 수 있습니다.

profile
머무르지 않기!

0개의 댓글