ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 5658. [모의 SW 역량테스트] 보물상자 비밀번호
    SWexpertAcademy 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;
    }

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

    댓글

Designed by Tistory.