https://school.programmers.co.kr/learn/courses/30/lessons/12936?language=cpp
자바 효율성이 통과가 안되서 한참 고민하다가
C++로 변환하니 바로 통과된다. 음 자바 너무 팍팍하게 해놓은거 아닌감
실패한 자바코드
import java.util.*;
class Solution {
public int[] solution(int n, long k) {
int[] answer = {};
answer = new int[n];
List<Integer> num = new ArrayList<>();
for(int i = 1; i <= n; ++i) {
num.add(i);
}
long[] total = new long[n+1];
total[1] = 1L;
for(int i = 2; i <= n; ++i)
{
total[i] = i * total[i-1];
}
double div = n;
long nk = k;
for(int i = 0; i < n; ++i)
{
int idx = (int)Math.ceil(nk*div/total[n-i])-1;
answer[i] = num.get(idx);
num.remove(idx);
div--;
if(n-i-1 == 0)
break;
nk %= total[n-i-1];
if(nk < 1)
nk = total[n-i-1];
}
return answer;
}
}
성공한 C++ 코드
#include <string>
#include <vector>
#include <cmath>
using namespace std;
vector<int> solution(int n, long long k) {
vector<int> answer;
vector<int> num;
for (int i = 1; i <= n; ++i) {
num.push_back(i);
}
vector<long long> total(n + 1);
total[1] = 1LL;
for (int i = 2; i <= n; ++i) {
total[i] = i * total[i - 1];
}
double div = n;
long long nk = k;
for (int i = 0; i < n; ++i) {
int idx = (int)(ceil(nk * div / total[n - i]) - 1);
answer.push_back(num[idx]);
num.erase(num.begin() + idx);
div--;
if (n - i - 1 == 0)
break;
nk %= total[n - i - 1];
if (nk < 1)
nk = total[n - i - 1];
}
return answer;
}