SWexpertAcademy

5658. [모의 SW 역량테스트] 보물상자 비밀번호

먼지의삶 2019. 7. 15. 23:27
#include<iostream>
#include<cstdio>
#include<vector>
#include<algorithm>

using namespace std;

int t;
int n, k;

int pick[28];

char a[28];
vector<int> result;

int zegop(int x) {
	int r = 1;
	if (x == 0)
		return 1;
	for (int i = 0; i < x; i++) {
		r *= 16;
	}
	return r;
}//제곱하는거, 최대 개수가 28개 -> 최대 자릿수 7개 -> 제곱 최대 6개 ->
//그냥 편하게함

void vect(int n, int rotate, vector<int>& solv) {

	for (int i = 0; i < n; i += rotate) {
		int pp = i % rotate;
		int sum = 0;
		for (int j = i; j < i + rotate; j++) {
			int x = rotate - (j % rotate) - 1;
			sum += pick[j] * zegop(x);
		}
		solv.push_back(sum);
	}
}//한바퀴 돌고 -> 한 변 값 제곱 * pic 곱해서 벡터에 저장하기

void trans(int n, int rotate) {
	char temp = a[n - 1];
	for (int i = n - 1; i >= 1; i--) {
		a[i] = a[i - 1];
	}
	a[0] = temp;
	for (int j = 0; j < n; j++) {
		if (a[j] == '1')
			pick[j] = 1;
		else if (a[j] == '2')
			pick[j] = 2;
		else if (a[j] == '3')
			pick[j] = 3;
		else if (a[j] == '4')
			pick[j] = 4;
		else if (a[j] == '5')
			pick[j] = 5;
		else if (a[j] == '6')
			pick[j] = 6;
		else if (a[j] == '7')
			pick[j] = 7;
		else if (a[j] == '8')
			pick[j] = 8;
		else if (a[j] == '9')
			pick[j] = 9;
		else if (a[j] == 'A')
			pick[j] = 10;
		else if (a[j] == 'B')
			pick[j] = 11;
		else if (a[j] == 'C')
			pick[j] = 12;
		else if (a[j] == 'D')
			pick[j] = 13;
		else if (a[j] == 'E')
			pick[j] = 14;
		else if (a[j] == 'F')
			pick[j] = 15;
		else if (a[j] == '0')
			pick[j] = 0;
	}
}//16진수 수 변환하기

bool check(vector<int>& v, int c) {
	for (int i = 0; i < v.size(); i++)
		if (v[i] == c)
			return false;
	return true;
}//다른벡터에 저장하기 전에, 중복 값 검사하기//크기가 최대 28 개정도라서 이렇게해도
//시간복잡도 적음

int main() {
	cin >> t;
	for (int xx = 1; xx <= t; xx++) {
		scanf("%d %d", &n, &k);

		for (int i = 0; i < n; i++) {
			scanf("%1s", &a[i]);
		}
		int rotate = n / 4;
		vector<int> solv;

		for (int i = 0; i < rotate; i++) {
			trans(n, rotate);
			vect(n, rotate, solv);

		}
		vector<int> rr;
		for (int i = 0; i < solv.size(); i++) {
			if (check(rr, solv[i]) == true)
				rr.push_back(solv[i]);//새로운 vector에 저장하기
		}
		sort(rr.begin(), rr.end(), greater<int>());//역순 정렬
	
		printf("#%d %d %d\n", xx, rr[k-1],rr.size() );
	}
	return 0;
}

오랜만에 이런 원초적이게 하려고하니까 조금오래걸렸다