문제 링크 : https://www.acmicpc.net/problem/1722

 

1722번: 순열의 순서

첫째 줄에 N(1≤N≤20)이 주어진다. 둘째 줄의 첫 번째 수는 소문제 번호이다. 1인 경우 k(1≤k≤N!)를 입력받고, 2인 경우 임의의 순열을 나타내는 N개의 수를 입력받는다. N개의 수에는 1부터 N까지의 정수가 한 번씩만 나타난다.

www.acmicpc.net

 

 

 

 문제 설명 

 

1. 첫줄에 순열의 길이 N이 주어짐

2. 둘째 줄에 문제의 번호와 그 구성요소가 주어지는데,

   1이주어지면 k번째 순열을 출력 하면되고 , 2가주어지면 그순열의 순서를 출력 하면됨.

 

 

 알고리즘 

1. 처음에 완전 탐색으로 풀었다가 바로 시간초과 fail..

2. 그래서 블로그를 찾아보며 알고리즘을 휙득(?) 함.

참고 블로그 : https://jaimemin.tistory.com/361

 

 코드 

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
#include<iostream>
#include<vector>
using namespace std;
 
 
int N, num;
vector<int> v,ans;
 
int check[21];
long long factorial[21],cnt=0,k;
 
int main() {
 
 
    cin >> N;
    factorial[0= 1;
    //팩토리얼을 미리계산
    for (int i = 1; i < 21; i++) {
        factorial[i] = factorial[i - 1* i;
    }
 
    cin >> num;
    //문제 1번
    if (num == 1) {
        cin >> k;
        for (int i = 0; i < N; i++) {
            for (int j = 1; j <= N; j++) {
                //이미 사용한 숫자는 continue
                if (check[j]) continue;
                //팩토리얼 수가 k 보다 작으면 k를 factorial 만큼 줄임
                if (factorial[N - 1-i] < k) {
                    k = k - factorial[N - 1-i];
                }
                else {
                    //팩토리얼 수가 k보다 크거나 같으면 출력벡터에 push.
                    ans.push_back(j);
                    check[j] = 1;
                    break;
                }
            }
        }
        
        for (int i = 0; i < ans.size(); i++) {
            cout << ans[i] << " ";
        }
 
    }
    //문제 2번
    else {
        for(int i = 0 ;i<N;i++){
            int k;
            cin >> k;
            v.push_back(k);
        }
        for (int i = 0; i < N; i++) {
            for (int j = 1; j < v[i]; j++) {
                if (!check[j]) {
                    cnt += factorial[N - i - 1];
                }            
            }
            check[v[i]] = 1;
        }
        cout << cnt + 1;
 
 
    }
 
 
 
}
cs

'c++ > 백준' 카테고리의 다른 글

백준 3015번 : 오아시스 재결합  (0) 2020.04.29
백준 1613번: 역사  (0) 2020.04.29
백준 9205번: 맥주마시면서 걸어가기  (0) 2020.04.29
백준 2293번 : 동전 1  (0) 2020.04.29
백준 1152번 : 단어의 개수  (0) 2020.04.29
ariz1623