WonYong-Jang / algorithm

0 stars 0 forks source link

순열, 조합 #12

Open WonYong-Jang opened 6 years ago

WonYong-Jang commented 6 years ago

순열

2018-10-01 9 24 25

모든 순열 10974 백준 / 다음 순열 10972/ 이전 순열

조합

==> 파스칼 삼각형은 수학에서 이항계수(서로 다른 몇개의 물건 중에 순서없이 물건을 선택할 수 있는 경우의 수)를 삼각형 모양의 기하학적 형태로 배열 한 것

2018-10-02 12 11 13 2018-10-01 8 37 37
WonYong-Jang commented 4 years ago

Next Permutation

==> leetcode 31 Next Permutation

참고

https://www.youtube.com/watch?v=mbOl9qPedDo&list=PL2mzT_U4XxDl8PP-jMk4rt6BPzBtS__pQ&index=25

WonYong-Jang commented 3 years ago

프로그래머스 줄서는 방법

[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]

==> slice = n! / n ==> 3!/3 ==> 2

==> (k-1)/slice ==> 4/2 == > 2 (2번 인덱스)

이유는 첫번째 숫자가 3이라는 것을 알았고 3으로 시작하는 순열만 보면 되기 때문에 k = 5%6 해주게 되면 0, 1 두개만 보면 된다.( 3으로 시작하는 순열 )

class Solution {
    public int[] solution(int n, long k) {
        int[] answer = new int[n]; // 정답 배열 

        if(n ==0 || k ==0) return new int[0];

        ArrayList<Integer> arr = new ArrayList<>();        
        for(int i=0; i< n; i++) { // 초기값 설정
            arr.add(i+1);
        }

        int index = 0;
        long slice = 0;
        while(n > 1) { // n == 1 이 될 때까지 (맨 뒷자리수만 남을 때 까지)
            slice = fac(n) / n;
            int deleteIdx = (int)((k - 1) / slice);
            answer[index++] = arr.remove(deleteIdx);

            k = k % slice;
            if(k ==0) k = slice;     // k 가 0일 경우 slice로 치환
            n--;
        }
        answer[index] = arr.get(0); // 마지막 남은 숫자는 그냥 넣어주기 

        return answer;
    }
    public long fac(long num) {
        if(num <= 1) return num;
        else return num * fac(num-1); 
    }
}

참고 : https://ydeer.tistory.com/61