GitHubSeob
C++ / 백준 / 20437 / 문자열 게임 2 본문
문제
https://www.acmicpc.net/problem/20437
20437번: 문자열 게임 2
첫 번째 문자열에서 3번에서 구한 문자열은 aqua, 4번에서 구한 문자열은 raquator이다. 두 번째 문자열에서는 어떤 문자가 5개 포함된 문자열을 찾을 수 없으므로 -1을 출력한다.
www.acmicpc.net
문제풀이
문자열과 정수를 입력받았을 때, 첫 글자와 끝글자가 같은 문자열 중 가장 짧은 길이, 가장 긴 길이를 구하는 문제이다.
단순히 알파벳의 개수, 위치를 저장하는 벡터를 만들고, 벡터를 탐색하면서 값들을 구하면 된다.
for (idx = 0; idx < W.size(); ++idx) {
cnt[W[idx] - 'a']++;
alp[W[idx] - 'a'].push_back(idx);
}
알파벳은 26개 이므로 각 알파벳이 몇 개나 있는지 세는 cnt 벡터,
해당 알파벳이 몇 번째 자리에 있는지를 저장하는 2차원 alp벡터를 만들었다. (alp[알파벳][알파벳 위치])
for (idx = 0; idx < 26; ++idx) {
if (cnt[idx] >= K) {
for (idx2 = K - 1; idx2 < alp[idx].size(); ++idx2) {
answer1 = min(answer1, alp[idx][idx2] - alp[idx][idx2 - K + 1] + 1);
answer2 = max(answer2, alp[idx][idx2] - alp[idx][idx2 - K + 1] + 1);
}
}
}
문자열을 구할 때 최소 K개의 같은 문자가 있어야 하므로, K개 이상인 알파벳일 때만 해당 for문을 탐색한다.
K가 3이라면 alp[알파벳][2] - alp[알파벳][0]+1부터 alp[알파벳][x] - alp[알파벳][x-2]+1이 되도록 식을 세웠다. (개수이므로 1을 더한다)
문제의 3번은 조건을 만족하는 길이의 최솟값, 4번은 길이의 최댓값이므로 min과 max를 이용한다.
if (answer1 == 10000 || answer2 == 0)
cout << "-1\n";
else
cout << answer1 << " " << answer2 << '\n';
문자열 W의 길이는 1 이상 10000 이하이므로 answer1은 10000으로 두고 최솟값으로 갱신하게 했고,
answer2는 최댓값을 구해야 하므로 0으로 두고 최댓값으로 갱신하게 했다.
문제의 예제 1을 보면 두 개 모두 못 구했을 때도 -1을 출력하므로 둘 중 하나라도 구하지 못하면 -1을 출력한다.
코드
#include <iostream>
#include <string>
#include <vector>
using namespace std;
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
int T(0), idx(0), idx2(0), K(0);
string W("");
cin >> T;
while (T--) {
cin >> W >> K;
int answer1(10000), answer2(0);
vector<vector<int>>alp(26, vector<int>(0, 0));
vector<int>cnt(26, 0);
for (idx = 0; idx < W.size(); ++idx) {
cnt[W[idx] - 'a']++;
alp[W[idx] - 'a'].push_back(idx);
}
for (idx = 0; idx < 26; ++idx) {
if (cnt[idx] >= K) {
for (idx2 = K - 1; idx2 < alp[idx].size(); ++idx2) {
answer1 = min(answer1, alp[idx][idx2] - alp[idx][idx2 - K + 1] + 1);
answer2 = max(answer2, alp[idx][idx2] - alp[idx][idx2 - K + 1] + 1);
}
}
}
if (answer1 == 10000 || answer2 == 0)
cout << "-1\n";
else
cout << answer1 << " " << answer2 << '\n';
}
}
'Baekjoon > Gold' 카테고리의 다른 글
C++ / 백준 / 1238 / 파티 (0) | 2023.07.01 |
---|---|
C++ / 백준 / 20210 / 파일 탐색기 (0) | 2023.06.20 |
C++ / 백준 / 17609 / 회문 (0) | 2023.06.19 |
C++ / 백준 / 1202 / 보석 도둑 (0) | 2023.06.16 |
C++ / 백준 / 9466 / 텀 프로젝트 (0) | 2023.06.14 |