문제 링크: 링크

 

테스트 케이스 1번

Sliding window를 사용하면 됩니다. 비밀번호 길이가 상자의 한 변의 길이니까 윈도우 사이즈는 n/4입니다.

 

이런식으로 슬라이딩 윈도우를 사용했고요 맨 뒤랑 앞에 이어지는 부분 신경쓰셔야 합니다.

비밀번호를 모아두는 컨테이너는 set을 사용을 했는데요, 중복된 값이 나올 수 있기도 하고, 그냥 귀찮기도 하고.. 해서 set을 써봤습니다.

 

내림차순으로 정렬된 순서에서 k번째 값을 구해야 하기 때문에 greater를 사용해 set이 내림차순으로 정렬되도록 만들었고요, 오름차순 set을 써도 되지만 그러면 중복된 값이 생길 때 set의 크기가 n이 아닐 수 있다는 점을 알고계셔야 합니다.

 

hex to dec는 다 아시겠지만.. \(1B3_{(16)}=1 \times 16^2 + 11 \times 16^1 + 3 \times 16^0 = 435\) 요런식으로 하시면 됩니다.

 

#pragma GCC optimize ("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,avx,avx2")

#define _CRT_SECURE_NO_WARNINGS
#include <bits/stdc++.h>

using namespace std;

typedef long long int lli;

int main()
{
#ifndef ONLINE_JUDGE
	freopen("input.txt", "r", stdin);
	//freopen("output.txt", "w", stdout);
#endif

	ios_base::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);

	int t;
	cin >> t;
	for (int tc = 1; tc <= t; ++tc) {
		int n, k;
		string s;
		cin >> n >> k >> s;
		
		set<lli, greater<lli>> password;
		for (int i = 0; i < n; ++i) {
			//sliding window
			lli pass = 0;
			const int& window_sz = n / 4;
			for (int j = 0; j < window_sz; ++j) {
				const char& cc = s[(i + j) % n];
				pass += (isdigit(cc)?cc-'0':cc-'A'+10) * pow(16, window_sz-(j+1));
			}
			password.insert(pass);
		}

		auto it = password.begin();
		for (int i = 0; i < k-1; ++i)
			++it;
		cout << "#" << tc << " " << *it << "\n";
	}



	return 0;
}

long long int를 사용을 했는데, n<=28이기 때문에 n==28일 때 비밀번호의 값이 FFFFFFFF 이런식으로 들어오면 signed int는 오버플로우가 나겠거니 하고 lli를 썼습니다.

근데 int로 바꿔봤는데 통과되는거 보니까 테스트 데이터 셋이 그렇게 빡세게 들어있지는 않네요.

 

이 문제는 난이도가 안적혀있는데 D2~3 정도 되는 것 같습니다.

반응형

'Online Judge > SW Expert Academy' 카테고리의 다른 글

[SWEA][C++] 9282: 초콜릿과 건포도  (0) 2020.03.24