728x90
programmers.co.kr/learn/courses/30/lessons/12936
#include <string>
#include <vector>
#include <cstring>
using namespace std;
long long fac[21];
bool check[21];
void fact(){
fac[0] = 1;
for (int i = 1; i <= 20; i++)
fac[i] = fac[i - 1] * i;
}
vector<int> solution(int n, long long k) {
vector<int> answer;
vector<bool> check(n, false);
fact();
int s = 0;
while(answer.size()!=n){
for(int i=0; i<n; i++){
if(check[i]==false){
long long num = fac[n-1-s];
if(k>num){
k-=num;
continue;
}
s++;
answer.push_back(i+1);
check[i]=true;
break;
}
}
}
return answer;
}
예> n=4 일때, k = 10일때
while문 첫번째
4!/4 = 3! = fac[3] = 6 = num 이다.
i=0 일 때 k>num , k=10-6=4
i=1 일 때 k<num -> 2 selected
while문 두번째
3!/3 = 2! = fac[2] =2 =num
i=0 일 때 k(=4) > num(=2), k=4-2=2
i=1 check[i] = true
i=2 일 때 k(=2)==num(=2) -> 3 selected
네 번째까지 반복하면 {2,3,4,1} 이나온다.
'프로그래머스 > 기타' 카테고리의 다른 글
N-Qeen - 시뮬레이션 (0) | 2021.03.04 |
---|---|
Level3 - 최고의 집합 (0) | 2021.02.27 |
2*n 타일링 (0) | 2021.02.03 |
피보나치 수 (0) | 2021.02.01 |
가장 큰 정사각형 찾기 (0) | 2021.01.21 |