[프로그래머스] Level3 - 줄 서는 방법

 
by 박신종

> 문제

문제 : [줄 서는 방법]



> 문제풀이

문제에서 k번째의 숫자를 찾아야 한다.

k는 n! 이하의 자연수이기 때문에 recursive하게 풀지는 못한다.

아이디어는 1 2 3 4 5 의 숫자가 있을 때,

'’뒤에서부터 자리를 바꾸면 되지 않을까” 에서 착안하였다.

k번 바꿀 수 있다면 뒤에서 부터 바꿔주면 된다.

1이 맨 앞에올 수 있는 경우의 수는 4! 이다.

첫 번째 인덱스는 k/4!이 될것이다.

두 번째 인덱스는 첫번째 인덱스 나머지 값 k%4! 에서 3!을 나눈 값이다.

즉, 해당 인덱스에 올 수 있는 값은 k/(n-1)! 이며, k=k%(n-1)! 해주어야 한다.

소스는 다음과 같다.

주의할 점은 아래 소스에서 List를 사용했는데 LinkedList로는 통과할 수 없다.

LinkedList는 탐색시간이 O(n) 이며 통과하지 못하였다.

ArrayLiset의 탐색시간이 O(1)이므로 통과할 수 있다.


import java.util.*;
class Solution {
    public int[] solution(int n, long k) {
        int[] answer = new int[n];
        long[] fact = new long[n+1];
        fact[0] = 1;                    
        for(int i=1; i<n+1; i++){
            fact[i]=i*fact[i-1];
        }
        List<Integer> list = new ArrayList<>();
        for(int i=0; i<n; i++){
            list.add(i+1);
        }
        k--;
        for(int i=0; i<n; i++){
            int index = (int)(k/fact[n-i-1]);
            answer[i] = list.remove(index);
            k = k % fact[n-i-1];
        }
        return answer;
    }
    
}




문제 출처 : Programmers