혼종 꼬지마루
[SWEA] 5658 - 보물상자 비밀번호 본문
https://www.swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AWXRUN9KfZ8DFAUo
(이 글이 문제가 될 시 삭제하도록 하겠습니다.)
기출문제인 톱니바퀴처럼 문자열을 돌려주면 쉽게 해결 할 수 있는 문제
일단 입력되는 문자열을 N/4만큼씩 잘라서 검사를 해 준다
map으로 문자열을 저장하면 하나의 문자열을 인덱스처럼 사용할 수 있기 때문
이 인덱스에 해당하는 문자열이 존재한다면 dab배열에 담지 않고, 없다면 잘라준 문자열을 16진수 -> 10진수로 바꾸어 dab 배열에 담아준다.
마지막으로 dab배열을 내림차순 정렬 후, K-1번째 숫자를 출력하면 끝
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 | #include <iostream> #include <cstdio> #include <map> #include <algorithm> #include <cmath> #define SIZE 30 using namespace std; char arr[SIZE]; int dab[SIZE*SIZE*SIZE]; int T, N, K, pos; void rotate() { char tmp = arr[0]; for (int i = 1; i < N; i++) arr[i - 1] = arr[i]; arr[N - 1] = tmp; } bool com(const int i, const int j) { return i > j; } int main(void) { scanf("%d", &T); for (int tc = 1; tc <= T; tc++) { scanf("%d %d %s", &N, &K, arr); int len = N / 4; pos = -1; map <string, int> check; for (int t = 0; t < len; t++) { for (int i = 0; i < N; i += len) { char tmp[8] = { 0 }; int st = -1; for (int j = i; j < i + len; j++) tmp[++st] = arr[j]; if (!check[tmp]) { int s = 0; for (int j = 0; j < len; j++) { if ('A' <= tmp[j] && tmp[j] <= 'F') s += (tmp[j] - 'A' + 10) * pow(16, len - j - 1); else s += (tmp[j] - '0') * pow(16, len - j - 1); } check[tmp] = 1; dab[++pos] = s; } } rotate(); } sort(dab, dab + (pos + 1), com); printf("#%d %d\n", tc, dab[K - 1]); } return 0; } | cs |
'Algorithms > SIMULATION' 카테고리의 다른 글
[프로그래머스] (2018)KAKAO BLIND - 오픈채팅방 (0) | 2018.11.09 |
---|---|
[백준] 16235 - 나무 재태크 (0) | 2018.11.08 |
[SWEA] 5650 - 핀볼 게임 (0) | 2018.09.21 |
[SWEA] 5656 - 벽돌 깨기 (4) | 2018.09.21 |
[백준] 15874 - Caesar Cipher (0) | 2018.09.17 |