본문 바로가기
ps

[백준] 20437 - 문자열 게임 2

by kariskan 2022. 9. 19.

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

 

20437번: 문자열 게임 2

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

www.acmicpc.net

 

문자열이 주어지고, 주어진 조건 2개에 맞는 sub string을 구하는 문제이다.

언뜻 보면 굉장히 다른 두 개의 조건 같지만, 실은 같은 구조의 조건이다.

바로 첫 번째, 마지막 글자가 같고 어떤 문자를 정확히 k개 포함하는 문자열이라는 것이다.

 

첫 번째 조건의 문자열도 위 문장을 적용시킬 수 있다.

 

그렇다면 조건에 맞는 문자열을 구하는 과정을 보자.

먼저 주어지는 문자열을 이용해서 각 알파벳이 어디에 위치하는지를 나타내는 배열을 하나 만들고 다음과 같이 저장하였다.

 

for (int i = 0; i < s.length(); i++) {
	v[s[i] - 'a'].push_back(i);
}

 

문자열에 나올 수 있는 알파벳의 개수는 26개이므로, 모든 알파벳의 위치들을 탐색해 슬라이딩 윈도우 기법으로 최대, 최소 길이를 구해주면 된다.

 

#include <iostream>
#include <vector>
using namespace std;

vector<vector<int>> v(26);

int main() {
	int t; cin >> t;
	while (t--) {
		v.clear();
		v.resize(26);
		string s; cin >> s;
		int n; cin >> n;

		for (int i = 0; i < s.length(); i++) {
			v[s[i] - 'a'].push_back(i);
		}

		int ans1 = -1, ans2 = -1;

		for (int i = 0; i < 26; i++) {
			if (v[i].size() < n) continue;
			int k = 0;

			while (k + n - 1 < v[i].size()) {
				if (ans1 == -1 || ans1 > v[i][k + n - 1] - v[i][k] + 1) {
					ans1 = v[i][k + n - 1] - v[i][k] + 1;
				}

				if (ans2 == -1 || ans2 < v[i][k + n - 1] - v[i][k] + 1) {
					ans2 = v[i][k + n - 1] - v[i][k] + 1;
				}

				k++;
			}
		}

		if (ans1 == -1 || ans2 == -1) {
			cout << -1 << '\n';
		}
		else cout << ans1 << ' ' << ans2 << '\n';
	}
}

'ps' 카테고리의 다른 글

[백준] 1188 - 음식 평론가  (1) 2022.09.21
[백준] 20207 - 달력  (0) 2022.09.19
[백준] 10711 - 모래성  (0) 2022.09.17
[백준] 2224 - 명제 증명  (0) 2022.09.17
[백준] 12978 - 스크루지 민호 2  (0) 2022.09.17

댓글