자료구조 & 알고리즘/프로그래머스
Level 2. 줄 서는 방법
diesuki4
2023. 6. 13. 07:31
Level 2. 줄 서는 방법
next_permutation() 함수로 간단하게 해결하면 시간 초과가 발생한다.
// 이 풀이는 시간 초과가 발생한다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
using namespace std;
vector<int> solution(int n, long long k)
{
vector<int> answer(n);
iota(answer.begin(), answer.end(), 1);
while (--k)
next_permutation(answer.begin(), answer.end());
return answer;
}
#include <iostream>
#include <vector>
#include <numeric>
using namespace std;
long long factorial(int n)
{
return (n <= 1) ? 1 : n * factorial(n - 1);
}
vector<int> solution(int n, long long k)
{
vector<int> answer;
vector<int> numbers(n);
iota(numbers.begin(), numbers.end(), 1);
while (0 < n)
{
long long fac = factorial(n) / n;
int idx = (k - 1) / fac;
idx = (idx < 0) ? 0 : idx;
k %= fac;
k = (k) ? k : fac;
answer.emplace_back(numbers[idx]);
numbers.erase(numbers.begin() + idx);
--n;
}
return answer;
}