Problem
Problem URL : 보물상자 비밀번호
[1] Answer Code (18. 10. 11)
#include<iostream>
#include<vector>
#include<algorithm>
#include<map>
#define ll long long
using namespace std;
ll char2int (char c){
if(c == 'A') return 10;
else if(c == 'B') return 11;
else if(c == 'C') return 12;
else if(c == 'D') return 13;
else if(c == 'E') return 14;
else return 15;
}
ll string2int(string s, int loop_cnt){
int p = 1;
ll sum = 0;
for(int i=loop_cnt-1; i>=0; i--, p *= 16){
if(s[i] >= '0' && s[i] <= '9'){ // 숫자
sum += ( s[i] - '0' ) * p;
}
else{ // 문자
sum += char2int(s[i]) * p;
}
}
return sum;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0); cout.tie(0);
int TC;
cin >> TC;
for(int tc=1; tc<=TC; tc++){
int n,k;
cin >> n >> k;
string s;
cin >> s;
int loop_cnt = n / 4;
map<ll,int> m;
for(int i=0; i<loop_cnt; i++){
/*
## st 변수 설명
n = 16이라면 (= 1234 5678 1234 5678)
n / 4 = 4번의 회전마다 동일한 키 값을 갖는다.
그렇기 때문에
st = 0 -> 1 -> 2 -> 3 순서로 시작점을 지정한다.
(= 1234 -> 2345 -> 3456 -> 4567)
*/
int st = 0 + i; // 시작점
/*
4개의 변이기 때문에
4번 for문을 돈다.
*/
for(int j=0; j<4; j++){ // [1]
string key = "";
/*
각 묶음안에서
하나의 키값을 만들기 위해서
loop_cnt만큼 for문을 돈다.
key값의 변화는
n = 16이라면 (= 1234 5678 1234 5678)
[ 1 -> 12 -> 123 -> 1234 ]로 변한다.
1번의 for문을 통해 1개의 키값을 만든다.
*/
for(int k=0; k<loop_cnt; k++){
key += s[(st+k) % n];
} // end of for k
ll res = string2int(key,loop_cnt);
m[res]++;
st += loop_cnt;
} // end of for j
} // end of for i
vector<ll> v;
for(auto iter : m){
v.push_back(iter.first);
}
sort(v.rbegin(),v.rend());
cout << "#" << tc << " " << v[k-1] << '\n';
}
}
Review
-
[SW Expert Academy] 문제.
-
[1] : for(int j=0; j<=loop_cnt; j++)로 해서 3개의 TC가 틀렸다.
n=4 (1234)일 때 틀리게 된다.
또한 n=16일 때만 정상적이고 n > 16일 경우 불필요하게 많은 for문을 돌게 된다.