티스토리 뷰

#문제 

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



#풀이


문제를 따라 구현을 하면 되는 문제이다.

딱히 어떤 방법을 사용하지 않고 풀었습니다.


일단 문제를 보게 되면, 문자열은 무조건 4등분 하게 되어있습니다.

여기서 중요한 점은 만약 N이 12일때, 한 칸에 3개의 수가 존재하게 되는데 3번 회전을 하게 되면 처음에 만들어진 16진수와 같아지게 된다. 따라서, N/4만큼만 회전을 시키면 모든 16진수를 알 수 있게 된다.


N/4만큼 돌리면서 주어진 문자열은 무조건 4등분 하여야한다.(여기서 실수 하여서 런타임 에러가 계속 났었다 :( )

등분을 할때 assign 메소드를 사용하여 임시 저장한 뒤 이를 set에 넣었다. 

set을 사용한 이유는 중간에 똑같은 16진수는 만들어질 수 있는 총 개수에 포함되지 않기 때문이다.


이후, set안에 넣어둔 16진수를 빼면서 10진수로 변환하여 vector 안에다가 저장을 하였다.

16진수에서 10진수로 바꾸는데 꽤 많은 시간을 들였던것 같다... ASCII와, 인덱스의 헷갈림으로... 실수를 줄이자!

이후 넣어준 vector에서 내림차순으로 sort를 진행하여 답을 도출 해 낸다. (굳이 내림차순으로 안해도 상관은 없다.)


#코드

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
#include <iostream>
#include <string>
#include <set>
#include <cmath>
#include <vector>
#include <algorithm>
using namespace std;
 
int N,K;
 
bool compare(int a, int b){
    return a > b;
}
 
int main(){
    int tc;
    cin >> tc;
    for(int t = 1; t <= tc; t++){
        cin >> N >> K;
        
        string str;
        cin >> str;
        
        int rotateCnt = N/4;
        int cnt = 0;
        set<string> nums;
        while(cnt <= rotateCnt){
            for(int i = 0; i < 4; i++){
                string temp;
                temp.assign(str,i*rotateCnt,rotateCnt);
                nums.insert(temp);
            }
            char c = str[str.size()-1];
            str.pop_back();
            str = c + str;
            cnt++;
        }
        vector<long long> tenNums;
        set<string>::iterator iter;
        for(iter = nums.begin(); iter != nums.end(); iter++){
            string Hnum = *iter;
            long long changeNum = 0;
            int HnumSize = (int)Hnum.size();
            for(int i = HnumSize-1; i >= 0; i--){
                if(Hnum[(HnumSize-1)-i] >= 65 && Hnum[(HnumSize-1)-i] <= 70){
                    changeNum += (pow(16,i) * (Hnum[(HnumSize-1)-i]-65+10));
                }else{
                    changeNum += (pow(16,i) * (Hnum[(HnumSize-1)-i]-48));
                }
            }
            tenNums.push_back(changeNum);
        }
        sort(tenNums.begin(), tenNums.end(), compare);
        cout << "#" << t << " " << tenNums[K-1<< endl;
    }
    return 0;
}
 
cs

'알고리즘 문제 풀이 > SW Expert' 카테고리의 다른 글

[SW Expert 5650] 핀볼 게임  (0) 2018.10.16
[SW Expert 5653] 줄기세포배양  (1) 2018.10.15
[SW Expert 5656] 벽돌 깨기  (1) 2018.10.14
[SW Expert 5644] 무선 충전  (6) 2018.10.12
[SW Expert 2112] 보호 필름  (2) 2018.07.06
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
TAG
more
«   2024/12   »
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
글 보관함