https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo
java로 두 번이나 풀어봤던 문제였는데 16진수로 변환하는 부분이 조금 달라서 푸는데 꽤 어려웠다...
먼저 한칸씩 회전시켜서 만들 수 있는 모든 숫자를 만들어야 하므로 N/4번만큼 돌려준다.
N/4번만큼 돌리면 처음 상태로 돌아오기 때문이다.
숫자를 구할 때는 먼저 문자들을 숫자로 변환해준다.
문자 0~9는 '0'을 빼줘서 숫자 0~9로 만들어주고
문자 A~F는 'A'를 빼주고(0이 됨) +10을 해주면 16진수 처럼만들어 줄 수 있다.
(ex. 'A' - 'A' + 10 = 10
'B' - 'A' + 10 = 11)
모든 문자를 숫자로 만들어 줬으면 이제 각 변에 저장될 숫자를 만들어 준다.
상자는 네 번 이므로 각 변에는 n/4만큼의 숫자가 들어간다.
n/4개의 숫자를 하나의 숫자(16진수)로 만들어주기 위해서 앞자리 수를 16만큼 계속 곱해준다.
한 변의 숫자가 만들어졌으면 벡터에 추가하고 다음 변의 숫자를 만들어준다.
만들 수 있는 모든 숫자를 벡터에 넣어줬다면
벡터를 정렬하고 중복을 제거해준다.
k 번째로 큰 수를 구해야 하는데 오름차순으로 정렬되므로
벡터의 size - k를 해주면 바로 k번째 큰 수를 구할 수 있다.
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
|
#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
int n, k;
string s;
vector<int> num;
void getnum() {
int box[4] = {0,};
int tmp[28];
//각 문자를 숫자로 변환
for (int i = 0; i < n; i++) {
if (s[i] >= '0' && s[i] <= '9') {
tmp[i] = s[i] - '0';
}
else { //A~F 는 10~15
tmp[i] = s[i] - 'A' + 10;
}
}
//상자의 각 변에 숫자를 넣는다.
int index = 0;
//상자의 네 변에 넣어준다.
for (int i = 0; i < 4; i++) {
//각각의 변에는 n/4개 만큼 들어간다
for (int j = 0; j < n / 4; j++) {
//16진수이므로 자릿수가 증가 할때 16을 곱해준다
box[i] = box[i] * 16 + tmp[index++];
}
//만들어진 숫자를 벡터에 추가
num.push_back(box[i]);
}
}
void rotate() {
char tmp = s[n - 1];
for (int i = n - 1; i > 0; i--) {
s[i] = s[i - 1];
}
s[0] = tmp;
}
void solve() {
// n/4 번째에는 0번째와 같아지므로 n/4번 회전
for (int i = 0; i < n / 4; i++) {
//만들 수 있는 숫자들을 구한다.
getnum();
//회전
rotate();
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
int T;
cin >> T;
for (int tc = 1; tc <= T; tc++) {
cin >> n >> k;
cin >> s;
solve();
//정렬, 중복 제거
sort(num.begin(), num.end());
num.erase(unique(num.begin(), num.end()),num.end());
//k번째 큰 수를 출력
int len = num.size();
cout << '#'<< tc << ' ' << num[len - k] << '\n';
//다음 테스트 케이스를 위해서 벡터 초기화
num.clear();
}
return 0;
}
Colored by Color Scripter
|
'SWEA > 모의 SW 역량테스트(C++)' 카테고리의 다른 글
[SWEA] 2115. [모의 SW 역량테스트] 벌꿀채취 (0) | 2019.08.05 |
---|---|
[SWEA] 1952. [모의 SW 역량테스트] 수영장 (0) | 2019.08.05 |
[SWEA] 4013. [모의 SW 역량테스트] 특이한 자석 (0) | 2019.07.11 |
[SWEA] 2105. [모의 SW 역량테스트] 디저트 카페 (0) | 2019.07.11 |
[SWEA] 2117. [모의 SW 역량테스트] 홈 방범 서비스 (0) | 2019.07.09 |