Gidhub BE Developer

[SW Expert Academy] 5658. 보물상자 비밀번호

2018-10-11
goodGid

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문을 돌게 된다.


Recommend

Index