Backend
home
🔡

[백준] 문자열 게임 2

생성일
2025/03/02 06:35
태그
BaekJoon
게시일
2025/03/02
최종 편집 일시
2025/03/02 06:51

문제

해결 방안 고민

1. 알파벳 소문자로 이루어진 문자열 W가 있음 2. 양의 정수 K 3. 어떤 문자를 정확히 K개 포함하는 가장 짧은 연속 문자열의 길이를 구함 4. 어떤 문자를 정확히 K개 포함하고, 문자열의 첫 번째와 마지막 글자가 해당 문자로 같은 가장 긴 연속 문자열의 길이를 구함 == 조건 2개 == - 어떤 문자를 정확히 K개 포함하는 가장 짧은 연속 문자열의 길이를 구함 - 어떤 문자를 정확히 K개 포함하고, 첫 번째 문자와 마지막 문자가 같아야 하며 가장 긴 연속 문자열 길이 구함 == 예시 (superaquatornado) == - 어떤 문자를 정확히 2개 포함하는 가장 짧은 연속 문자열의 길이를 구함 => aqua - 어떤 문자를 정확히 2개 포함하고, 첫 번째 문자와 마지막 문자가 같아야 하며 가장 긴 연속 문자열 길이 구함 => raquator
Markdown
복사
접근법 자체를 고민하느라 시간이 많이 걸린 문제였다.
결국 다른 분의 풀이를 참고하여 문제를 해결하였다.

해결 방법

문제의 조건을 보면 다음과 같다
소문자로 이루어진 문자열에서 어떤 문자를 K개 포함하는 가장 짧은, 가장 긴 문자열의 길이를 구한다.
만족하는 문자열이 없다면 -1을 출력한다.
문제풀이
입력받는 문자열의 소문자별로 개수를 센다
문자열의 첫 번째 문자부터 탐색을 시작하며, 해당 문자의 개수가 K개 이하인 경우 탐색하지 않는다.
뒷 문자열과 비교하여 같은 문자의 개수를 세어주고, 같은 문자의 수가 K개가 되는 순간 min, max 값을 계산한다.
입력받는 문자열의 알파벳 개수를 센다
K개 이하인 문자는 탐색에서 제외해야 한다.
문자열의 첫 번째 문자부터 탐색을 하며, 해당 문자의 개수가 K개 이하인 경우 탐색하지 않는다
탐색은 문자열의 길이만큼 진행된다.
뒷 문자열과 비교하여 같은 문자의 개수를 세어주고, 같은 문자의 수가 K개가 되는 순간 min, max값을 계산한다
count가 K가 된다는 의미는 탐색을 시작하는 문자에서 부터 현재 문자까지 문제에서 요구하는 조건 만큼의 문자를 포함하는 길이가 되었으므로 min, max를 계산해 준다.
min은 최소 길이이므로 K만큼 포함되는 순간 더 이상 탐색을 할 필요가 없다.
max는 첫 번째와 마지막 글자가 같은 가장 긴 연속 문자열의 길이이므로 K 이상 되는 순간 탐색 할 필요가 없다.

코드

package algo250302; import java.io.*; public class Baek20437 { public static void main(String[] args) throws IOException { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int T = Integer.parseInt(br.readLine()); for (int i = 0; i < T; i++) { String W = br.readLine(); int K = Integer.parseInt(br.readLine()); if (K == 1) { System.out.println("1 1"); continue; } // 알파벳별 개수 저장 int[] alpha = new int[26]; int length = W.length(); for (int j = 0; j < length; j++) { alpha[W.charAt(j) - 'a']++; } int min = Integer.MAX_VALUE; // 최솟값은 가장 큰 수로 int max = -1; // 최댓값은 가장 작은 수로 for (int j = 0; j < length; j++) { if (alpha[W.charAt(j) - 'a'] < K) { continue; } int count = 1; for (int l = j + 1; l < length; l++) { if (W.charAt(j) == W.charAt(l)) { count++; } if (count == K) { min = Math.min(min, l - j + 1); max = Math.max(max, l - j + 1); break; } } } if (min == Integer.MAX_VALUE || max == -1) { System.out.println("-1"); } else { System.out.println(min + " " + max); } } } }
Java
복사