티스토리 뷰
#문제
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 |