Algorithm/SWEA

5658. [모의 SW 역량테스트] 보물상자 비밀번호

benguin 2019. 7. 11. 14:15

[URL]

https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo

 

SW Expert Academy

SW 프로그래밍 역량 강화에 도움이 되는 다양한 학습 컨텐츠를 확인하세요!

www.swexpertacademy.com

 

[풀이 과정]

* 시뮬레이션

 

(예시)

 (1, B, 3, B, 3, B, 8, 1, F, 7, 5, E) 12개의 숫자가 주어지고 K 10인 경우

1. input & init

 

2. 한 변의 자리수 계산, 자릿수만큼 로테이션

 

3. input[] 배열을 자리수 길이만큼 끊어서 계산

 

4. 자리수에 해당 하는 temp[] 배열에 값 저장

  ex) 3자리씩 1B3, B3B, 81F, 75E

 

5. temp값을 long형태로 변환 후 벡터v 에 저장

 

6. 내림차순 정렬, 중복값 제거

 

 

[소스 코드]

 

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
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <vector>
#include <algorithm>
 
using namespace std;
 
char sixteen[16= { '0''1''2''3''4''5''6''7''8''9''A''B' ,'C''D''E''F' };
 
int N, K;
char input[29];
char copy_input[29];
vector <long> v;
 
void rotate()
{
    for (int i = 0; i < N; i++)
    {
        if (i == 0)
            copy_input[i] = input[N - 1];
        else
            copy_input[i] = input[i - 1];
    }
}
bool cmp(long a, long b){
    return a > b;
}
 
int main() {
    int T;
    scanf("%d"&T);
 
    for (int tc = 0; tc < T; tc++)
    {
        v.clear();
        scanf("%d %d"&N, &K);
        scanf("%s"&input);
 
        // 한 변에 들어갈 자리수 결정
        int totalCnt = N / 4;
 
        // 크게 for문 돌린다.  totalCnt 번
        for (int i = 0; i < totalCnt; i++)
        {
            // i만큼 회전 input[] 배열 뒤로 1칸식 밀어주기
            if (i == 0)
            {
                for (int j = 0; j < N; j++)
                {
                    copy_input[j] = input[j];
                }
            }
            else
            {
                rotate();
            }
 
            // temp 추출 ! 
            char temp[7];
 
            for (int j = 0; j < N; j++)
            {
                if (j % totalCnt == 0)
                {
                    for (int k = 0; k < totalCnt; k++)
                    {
                        temp[k] = copy_input[j + k];
                    }
 
                    long valTemp = 0;
 
                    for (int k = 0; k < totalCnt; k++)
                    {
                        int indexVal;
 
                        for (int q = 0; q < 16; q++)
                        {
                            if (temp[k] == sixteen[q])
                            {
                                indexVal = q;
                                break;
                            }
                        }
                        valTemp += (indexVal * pow(16, totalCnt - k - 1));
                    }
                    v.push_back(valTemp);
                }
            }
 
            // input[] 초기화
            for (int j = 0; j < N; j++)
            {
                input[j] = copy_input[j];
            }
        }
 
        // 내림차순 정렬
        sort(v.begin(), v.end(), cmp);
 
        // 중복값 제거
        for (int i = 0; i < v.size() - 1;)
        {
            long cmp = v[i];
 
            if (cmp == v[i + 1])
                v.erase(v.begin() + i);
            else
                i++;
        }
 
        printf("#%d %d\n", tc+1, v[K-1]);
    }
 
    return 0;
}
cs