피너클의 it공부방

백준 20437 문자열 게임 2 (c++) : 피너클 본문

백준

백준 20437 문자열 게임 2 (c++) : 피너클

피너클 2025. 9. 13. 18:03
728x90
반응형

20437번: 문자열 게임 2

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

 

그냥 풀었다.

 

	int test;
	cin >> test;
	while (test-- > 0) {
		cin >> str;
		cin >> k;

		vector<int> arr[27];

arr은 각 알파벳의 위치가 들어간다.

arr[0]에는 a의 위치들이 들어간다.

 

		int len = str.length();
		
		for (int i = 0; i < len; i++) {
			int index = str[i] - 'a';
			arr[index].push_back(i);
		}

위치들을 넣어준다.

		int ans_min = 987654321, ans_max = -1;

		for (int eng = 0; eng < 27; eng++) {

			for (int i = 0; i + k - 1 < arr[eng].size(); i++) {
				ans_min = min(ans_min, arr[eng][i + k - 1] - arr[eng][i] + 1);
				ans_max = max(ans_max, arr[eng][i + k - 1] - arr[eng][i] + 1);
			}
		}

그리고 위치들에서 k만큼 떨어진놈들의 길이를 구해주면 된다.

		if (ans_min == 987654321) cout << -1 << '\n';
		else cout << ans_min << ' ' << ans_max << '\n';
	}

	return 0;
}

출력하면 끝이다.

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string>

using namespace std;

int k;
string str;

int main(int argc, char** argv)
{
	std::ios_base::sync_with_stdio(false);
	std::cin.tie(NULL);

	int test;
	cin >> test;
	while (test-- > 0) {
		cin >> str;
		cin >> k;

		vector<int> arr[27];

		int len = str.length();
		
		for (int i = 0; i < len; i++) {
			int index = str[i] - 'a';
			arr[index].push_back(i);
		}

		int ans_min = 987654321, ans_max = -1;

		for (int eng = 0; eng < 27; eng++) {

			for (int i = 0; i + k - 1 < arr[eng].size(); i++) {
				ans_min = min(ans_min, arr[eng][i + k - 1] - arr[eng][i] + 1);
				ans_max = max(ans_max, arr[eng][i + k - 1] - arr[eng][i] + 1);
			}
		}

		if (ans_min == 987654321) cout << -1 << '\n';
		else cout << ans_min << ' ' << ans_max << '\n';
	}

	return 0;
}

전체코드다.

728x90
반응형
Comments