[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][5658번] 보물상자 비밀번호
본문 바로가기

알고리즘 문제풀기/SWEA

[소프트웨어 익스퍼트 아카데미][SWEA][모의 SW 역량테스트][ C++][5658번] 보물상자 비밀번호

반응형

이 문제는 16진수로 되어 있는 수를 모두 10진수로 변환시키고 N/4만큼만 회전시켜 풀어야 했던 문제입니다.

10진수로 변환시켜 계산한 수를 중복처리 하는 과정을 잘못하면 49/50으로 틀렸다고 나오는 문제였습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#include<iostream>
#include<deque>
#include<vector>
#include<algorithm>
#include<functional>
using namespace std;
int ans;
int N, K;
deque<int> dq;
vector<int> v;
int sum;
//N/4회전 은 같아짐으로 N/4만큼만 돌려주면됨
void init() {
    ans = 0;
    v.clear();
    while (!dq.empty())
        dq.pop_back();
}
void go(int end) {
    dq.pop_front();
    int ee = endint check = end - 2;
    while (ee--) {
        int sum = 0;
        int dq_end = dq.size();
        for (register int i = 0; i < dq_end; i++) {
            int c = dq.front();
            dq.push_back(c);
            dq.pop_front();
            int num = 1;
            if (check == 0) {
                sum += c;
                check = end - 2;
                v.push_back(sum);
                sum = 0;
                continue;
            }
            for (register int j = check; j > 0; j--) {
                num *= 16;
            }
            sum += (num*c);
            check--;
        }
        //회전
        if (ee > 1) {
            int a = dq.back();
            dq.pop_back();
            dq.push_front(a);
        }
        else continue;
    }
    sort(v.begin(), v.end(),greater<int>());
    int chk = 1;
    int cnt = 0;
    for (int i = 0; i < v.size(); i++)
    {
        if (v[i] == chk)
            continue;
        chk = v[i];
        cnt++;
        if (cnt == K)
            break;
    }
    ans = chk;
}
int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(0); cout.tie(0);
    int T;
    scanf("%d"&T);
    //cin >> T;
    for (register int t = 1; t <= T; t++) {
        init();
        scanf("%d %d"&N, &K);
        //cin >> N >> K;
        for (register int n = 0; n <= N; n++) {
            char cc;
            scanf("%c"&cc);
            //cin >> cc;
            if (cc >= 'A'&& cc <= 'F') {
                dq.push_back(cc - 'A' + 10);
            }
            else {
                dq.push_back(cc - '0');
            }
        }
        int finsh = N / 4;
        go(finsh + 1);
        printf("#%d %d\n", t, ans);
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
http://colorscripter.com/info#e" target="_blank" style="text-decoration:none;color:white">cs

반응형