• 고민

    사각형의 한변에 묶일 문자그룹의 수 - 1 만큼 회전시키면 모든 경우를 구할 수 있기에 구할 수 있는 문자의 합을 구한 다음 정렬 후 중복을 제거한 뒤 k번째 큰수를 출력하는 간단한 문제였다.

  • 소스

    #include <iostream>
    #include <string>
    #include <algorithm>
    #include <vector>
    using namespace std;
      
    int getDec(char c, int index, int max) {
    	int t = 1;
    	for (int i = index; i < max - 1; i++) {
    		t *= 16;
    	}
    	if (c == 'F') {
    		return 15 * t;
    	} else if (c == 'E') {
    		return 14 * t;
    	} else if (c == 'D') {
    		return 13 * t;
    	} else if (c == 'C') {
    		return 12 * t;
    	} else if (c == 'B') {
    		return 11 * t;
    	} else if (c == 'A') {
    		return 10 * t;
    	} else {
    		return (c - '0') * t;
    	}
    }
      
    int main() {
    	ios::sync_with_stdio(false);
    	int t, n, k;
    	string s;
    	cin >> t;
    	int ans = 1;
    	while (t--) {
    		vector<int> v;
    		cin >> n >> k;
    		cin >> s;
    		int cut = n / 4;
    		int group = n / cut;
    		for (int k = 0; k < cut; k++) {
    			vector<int> cutted(group);
    			for (int i = 0; i < group; i++) {
    				for (int j = 0; j < cut; j++) {
    					cutted[i] += getDec(s[j + cut * i], j, cut);
    				}
    			}
    			for (int i = 0; i < group; i++) {
    				v.push_back(cutted[i]);
    			}
    			s = s.substr(s.size() - 1, 1) + s.substr(0, s.size() - 1);
    		}
    		vector<int>::iterator new_end;
    		sort(v.begin(), v.end(), greater<int>());
    		new_end = unique(v.begin(), v.end());
    		v.erase(new_end, v.end());
    		cout << '#' << ans++ << ' ' << v[k - 1] << '\n';
    	}
      
    	return 0;
    }