반응형
문제 출처 :
https://www.acmicpc.net/problem/1138
알고리즘 분석 :
문제 해결에 필요한 사항
1. Permutation :: http://www.crocus.co.kr/306
2. 부르트 포스
사실상 이 문제는 N의 최대가 10이기에, 10!로 모든 경우를 다따져서 해결 할 수 있다.
위의 Permutation 링크에서 순열 코드를 이용하여 그대로 쓴 후, 그 내부인 k == m에서 자신보다 앞에 몇명이 존재하는지
for문을 통해 체크해주고 한번이라도 틀리면 break로 중지하고 다른 순열을 확인하면 된다.
10!에 내부 for문까지해서 O(10*10!) = 36,288,000이기에 무난하게 통과한다.
소스 코드 :
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 | #include <iostream> #include <cstdio> #include <algorithm> using namespace std; typedef pair<int, int> pii; pii arr[51]; int cnt = 0; void permutations(pii *a, const int k, const int m) { int i; int temp; if (k == m) //순열이 완성됐을 때 한 줄로 서기 검사 { bool chk = false; for (i = 0; i <= m; i++) { int front = 0; for (int j = i - 1; j >= 0; j--) if (a[i].first < a[j].first) front++; if (front == a[i].second) chk = true; else { chk = false; break; } } if (chk) { for (int i = 0; i <= m; i++) printf("%d ", a[i].first); exit(0); } } else { for (i = k; i <= m; i++) { swap(a[k], a[i]); permutations(a, k + 1, m); swap(a[k], a[i]); } } } int main() { int n; scanf("%d", &n); for (int i = 0; i < n; i++) { int val; scanf("%d", &val); arr[i] = { i + 1, val }; } permutations(arr, 0, n - 1); // 0~n-1 까지의 수는 총 n가지이다. } // This source code Copyright belongs to Crocus // If you want to see more? click here >> | Crocus |
반응형
'Applied > 알고리즘 문제풀이' 카테고리의 다른 글
[10827번] a^b (0) | 2017.04.21 |
---|---|
[2589번] 보물섬 (0) | 2017.04.21 |
[13711번] LCS 4 (0) | 2017.04.20 |
[1958번] LCS 3 (0) | 2017.04.19 |
[9252번] LCS 2 (0) | 2017.04.19 |