[프로그래머스] 레벨3 (level3) 줄서는방법
2020년 06월 25일, 12:40
줄 서는 방법
문제설명
n명의 사람이 일렬로 줄을 서고 있습니다. n명의 사람들에게는 각각 1번부터 n번까지 번호가 매겨져 있습니다. n명이 사람을 줄을 서는 방법은 여러가지 방법이 있습니다. 예를 들어서 3명의 사람이 있다면 > 다음과 같이 6개의 방법이 있습니다.
- [1, 2, 3]
- [1, 3, 2]
- [2, 1, 3]
- [2, 3, 1]
- [3, 1, 2]
- [3, 2, 1]
사람의 수 n과, 자연수 k가 주어질 때, 사람을 나열 하는 방법을 사전 순으로 나열 했을 때, k번째 방법을 return하는 solution 함수를 완성해주세요.
제한사항
- n은 20이하의 자연수 입니다.
- k는 n! 이하의 자연수 입니다.
입출력 예
n k result 3 5 [3, 1, 2] 입출력 예시 설명
입출력 예 #1
문제의 예시와 같습니다.
문제 풀이
- n만큼 숫자 배열을 만든다.
- factorial값(n으로 만들 수 있는 경우의 수)을 구한다.
- 배열은 0부터 시작하니까 k를 1줄여준다.
- answer의 길이가 n만큼까지 while문을 돌린다.
- fac = fac/arr.length => n-1까지의 경우의 수
- k를 fac으로 나눈 값이 선택한 숫자가 된다.(n이 3, k=5인 경우 2x1으로 k를 나누면 선택해야할 숫자를 알 수 있다.)
- answer에 선택한 숫자를 넣어준다.
- k는 fac로 나눈 나머지로 바꿔준다.
- arr에서도 선택한 숫자를 제거.
function solution(n, k) {
var answer = [];
let arr = [];
for (let i = 1; i <= n; i++) arr.push(i);
let fac = arr.reduce((acc, val) => acc * val, 1);
k--;
while (answer.length !== n) {
fac = fac / arr.length;
// console.log(fac);
let temp = arr[Math.floor(k / fac)];
answer.push(temp);
k = k % fac;
arr = arr.filter(e => e !== temp);
}
return answer;
}