[Programmers] 줄 서는 방법

Sierra·2023년 2월 14일
0

[Programmers] LV2

목록 보기
17/18
post-thumbnail

https://school.programmers.co.kr/learn/courses/30/lessons/12936

문제 설명

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! 이하의 자연수 입니다.

입출력 예

nkresult
35[3,1,2]

Solution

import java.util.*;

class Solution {

    public int[] solution(int n, long k) {
        List<Integer> arr = new ArrayList<>();
        int[] answer = new int[n];
        long factorial = 1;
        for (int i = 1; i <= n; i++) {
            factorial *= i;
            arr.add(i);
        }
        k--;

        int idx = 0;
        while (n > 0) {
            factorial /= n;
            answer[idx++] = arr.get((int) (k / factorial));
            arr.remove((int) (k / factorial));
            k %= factorial;
            n--;
        }
        return answer;
    }

}

완전 탐색으로 모든 경우의 수를 구하기엔 너무나 수가 많아서 어려운 문제.
그러므로 생각을 전환해야한다.

모든 경우의 수는 순열 조합 시간에 배웠듯이 N!이라고 할 수 있다.
그리고 숫자의 갯수는 정해져있으므로 각 숫자는 맨 앞자리에 반드시 N!/N번 나온다. 이 개념을 통해 K번째 숫자의 앞자리 수를 알 수 있다.

마찬가지로 N! / N 번씩 다음 순번의 숫자가 나오므로 K = (K-1) % (N - 1)! 를 통해 다음번 데이터들을 구할 수 있다.

profile
블로그 이전합니다 : https://swj-techblog.vercel.app/

0개의 댓글