Algorithm/Cases-Study

SWEA-5658 보물상자 비밀번호

Xi_kor 2021. 4. 16. 19:05

char로 문자형으로 배열을 받은 후에, 네 면을 서치하면서 16진수를 확인하며 int형 변수에 해당 값을 변환하며 넣어주었다. 그 이후에 네 면을 확인하는 것이 끝나면 큐의 맨 마지막 수로 시작할 수 있게끔 큐의 수 -1만큼 뒤에 붙여줍니다. 

#include <iostream>
#include <queue>
#include <algorithm>
#include <cstring>
using namespace std;

int main() {
	int tc;
	cin >> tc;

	for (int T = 1; T <= tc; T++) {
		int n, K;
		cin >> n >> K;
		queue <char> q;
		for (int i = 0; i < n; i++) {
			char tmp;
			cin >> tmp;
			q.push(tmp);
		}

		vector <int> v;

		for (int i = 0; i < n / 4; i++) {
			for (int j = 0; j < 4; j++) {
				int res = 0;
				for (int k = 0; k < n / 4; k++) {
					res = res * 16;
					char tmp = q.front();
					q.pop();
					q.push(tmp);
					if (tmp >= 'A' && tmp <= 'F') res += tmp - 55;
					else res += tmp - '0';
				}
				v.push_back(res);
			}
			for (int j = 0; j < n - 1; j++) {
				char tmp = q.front();
				q.pop();
				q.push(tmp);
			}
		}
		sort(v.rbegin(), v.rend());
		int cnt = 0;
		for (int i = 0; i < v.size(); i++) {
			if (i!=0&&v[i] == v[i - 1]) continue;
			else cnt++;

			if (cnt == K) {
				cout << "#" << T << " " << v[i] << '\n';
			}
		}
	}
	return 0;
}