반응형
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 |
반응형
'백준' 카테고리의 다른 글
[ 백준 ] 10464번 - XOR (C++) (0) | 2023.06.15 |
---|---|
[ 백준 ] 7490번 - 0 만들기 (C++) (0) | 2023.06.14 |
[ 백준 ] 12919번 - A와 B 2 (C++) (0) | 2023.06.12 |
[ 백준 ] 14463번 - 소가 길을 건너간 이유 9 (C++) (0) | 2023.06.11 |
[ 백준 ] 5817번 - 고통받는 난쟁이들 (C++) (0) | 2023.06.10 |