반응형

https://www.acmicpc.net/problem/20437

 

20437번: 문자열 게임 2

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

www.acmicpc.net

 

 

[ 문제풀이 ]

 

1. cnt 배열과 vector<int> list 배열을 만들어 해당 문자의 개수와 인덱스를 저장합니다.

 

2. 만약 cnt[ i ]가 K보다 크거나 같다면 list[ i ][ j + K - 1 ] - list[ i ][ j ]길이 중 가장 긴 길이를 Max에 저장하고, 제일 짧은 길이를 Min에 저장합니다.

 

3. cnt[ i ] 중 K보다 크거나 같은 조건을 만족하는 문자가 없다면 -1을 출력하고, 그렇지 않다면 Max와 Min을 출력합니다.

 

[ 소스코드 ]

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
#include<iostream>
#include<string>
#include<vector>
 
using namespace std;
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    int T;
    cin >> T;
 
    for (int t = 0; t < T; t++) {
        string W;
        int K;
        int cnt[200= { 0 };
        vector<int> list[200];
        int Min = 987654321;
        int Max = 0;
        cin >> W >> K;
 
        for (int i = 0; i < W.size(); i++) {
            cnt[W[i]]++;
            list[W[i]].push_back(i);
        }
 
        for (int i = 'a'; i <= 'z'; i++) {
            if (cnt[i] >= K) {
                for (int j = 0; j < cnt[i] - K + 1; j++) {
                    Min = min(Min, list[i][j + K - 1- list[i][j] + 1);
                    Max = max(Max, list[i][j + K - 1- list[i][j] + 1);
                }
            }
        }
        if (Min == 987654321 || Max == 0) {
            cout << -1 << '\n';
        }
        else {
            cout << Min << ' ' << Max << '\n';
        }
    }
}
cs
반응형

+ Recent posts