반응형
문제출처
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 |