반응형

문제출처

https://programmers.co.kr/learn/courses/30/lessons/12936



소스코드


효율성 - 시간초과

(next_permutation은 모든 순열을 다 보면서 세기때문에 시간복잡도가 O(n!)이다....


1
2
3
4
5
6
7
8
9
10
11
12
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
 
vector<int> solution(int n, long long k) {
    vector<int> answer(n, 0);
    for(int i=0; i<n; i++) answer[i] = i+1;
    for(int i=0; i<k-1; i++) next_permutation(answer.begin(), answer.end());
  
    return answer;
}
cs



정답 코드


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
#include <vector>
using namespace std;
 
long long makeFactorial(long long n) {
    long long ret=1;
    for(long long i=1; i<=n; i++) ret*=i;
    return ret;
}
 
vector<int> solution(int n, long long k) {
    vector<int> answer;
    vector<int> v(n,0);
    for(int i=0; i<n; i++) v[i] = i+1;
    
    int num=n;
    int quotient;
    long long remain;
    long long fac;
    while(num>0) {
        num--;
        fac=makeFactorial(num);
        remain = k % fac;
        quotient = (int)(k / fac);
        
        if(remain==0) {
            quotient--;
            answer.push_back(v[quotient]);
            v.erase(v.begin()+quotient);
            break;
        }
        
        answer.push_back(v[quotient]);
        v.erase(v.begin()+quotient);
        k=remain;
    }
    
    for(int i=v.size()-1; i>=0; i--) {
        answer.push_back(v[i]);
        v.erase(v.begin()+i);
    }
    
    return answer;
}
cs


반응형

'Algorithm' 카테고리의 다른 글

[BOJ 4948] 베르트랑 공준  (0) 2019.07.03
[BOJ 10872] 팩토리얼  (0) 2019.07.03
[프로그래머스 42840] 모의고사(완전탐색)  (0) 2019.04.23
[BOJ 1655] 가운데를 말해요  (0) 2019.04.16
[BOJ 1157] 단어공부  (0) 2019.04.15

+ Recent posts