반응형
문제 출처 :
https://swexpertacademy.com/main/code/problem/problemDetail.do?contestProbId=AV15Khn6AN0CFAYD&
알고리즘 분석 :
문제 해결에 필요한 사항
1. Dynamic Programming
완전탐색을 통해 모든 값을 다 찾아본다.
이때 visit라는 dp배열을 이용하는데 cnt & 1의 의미는
스왑할때마다 1 2 -> 2 1 -> 1 2가 되는데
2 1에서 cnt & 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 60 61 62 | #include <iostream> #define SWAP(a, b){int t = a; a = b; b = t;} #define MAX(a,b)(a > b ? a : b) int n; int len; int ans; bool visit[1000000][2][11]; int visitCnt; void init() { ans = len = 0; visitCnt++; } int _strlen(char *str) { len = 0; for (; str[len]; len++) {} return len; } void combi(char *str, int cnt) { int mul = 1; int val = 0; for (int i = len - 1; i >= 0; i--) { val = val + (str[i] - '0') * mul; mul *= 10; } if (cnt == n) { ans = MAX(ans, val); return; } if (visit[val][cnt & 1][visitCnt]) { return; } visit[val][cnt & 1][visitCnt] = true; for (int i = 0; i < len; i++) { for (int j = i + 1; j < len; j++) { SWAP(str[i], str[j]); combi(str, cnt + 1); SWAP(str[i], str[j]); } } } int main() { freopen("input.txt", "r", stdin); int tCase; scanf("%d", &tCase); for (int tc = 1; tc <= tCase; tc++) { init(); char str[10]; scanf("%s %d", str, &n); len = _strlen(str); printf("%s %d\n", str, n); combi(str, 0); printf("#%d %d\n", tc, ans); } return 0; } | cs |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[1265번] 달란트2 (0) | 2019.06.10 |
---|---|
[12174번] #include <Google I/O.h> (0) | 2019.06.08 |
[SwExpertAcademy] 평등주의 (0) | 2019.06.04 |
[Codeground 11번] 개구리 뛰기 (0) | 2019.06.03 |
[14582번] 오늘도 졌다 (0) | 2019.06.01 |