조합 예제 - 6

문제 분석

  • 조합 문제와는 다르게 순열의 개념을 알아야 풀 수 있다.

  • 순열은 순서가 다르면 다른 경우의 수로 인정한다. N자리로 만들 수 있는 순열의 경우의 수를 구해야 한다는 것이 문제의 핵심이다.

  • 가장 먼저 각 자리에서 사용할 수 있는 경우의 수를 구한다.(예: N = 4)

    • 1번째 자리 : 앞에서부터 채운다고 가정하면 제일 앞에서 사용할 수 있는 수는 4가지다.(1, 2, 3, 4)

    • 2번째 자리 : 앞자리에서 사용한 수를 제외한 수를 사용할 수 있으므로 사용할 수 있는 수는 3가지

    • 3번째 자리 : 앞자리에서 사용한 수 2개를 제외한 수를 사용할 수 있으므로 사용할 수 있는 수는 2가지

    • 4번째 자리 : 앞자리에서 사용한 수 3개를 제외한 수를 사용할 수 있으므로 사용할 수 있는 수는 1가지

  • 이렇게 각 자리에서 구한 경우의 수를 모두 곱하면 모든 경우의 수가 나온다.

  • 4자리로 표현되는 모든 경우의 수는 4 * 3 * 2 * 1 = 4! = 24이다.

  • 이를 일반화하면 N자리로 만들 수 있는 순열의 모든 경우의 수는 N!이라는 것을 알 수 있다.

손으로 풀어보기

  1. 자릿수에 따른 순열의 경우의 수를 1부터 N자리까지 미리 계산한다.

  2. 소문제 1, K번째 순열 출력하기

    • K번째 순열 출력하기

      1. 주어진 값(K)과 현재 자리수(N) - 1에서 만들 수 있는 경우의 수를 비교한다.

      2. a번에서 K가 더 작아질 때까지 경우의 수를 배수(cnt)로 증가시킨다.(순열의 순서를 1씩 늘림)

      3. K가 더 작아지면 순열에 값을 저장하고 K를 K = K - (경우의 수 * (cnt - 1))로 업데이트한다.

      4. 순열이 완성될 때까지 a ~ c 과정을 반복하고 완료된 순열을 출력한다.

  3. 소문제 2, 입력된 순열의 순서 구하기

    • 입력된 순열의 순서 구하기

      1. 현재 자릿수의 숫자를 확인하고 해당 숫자보다 앞 숫자 중 미사용 숫자를 카운트한다.

      2. 미사용 숫자 개수 * (현재 자리 - 1에서 만들 수 있는 순열의 개수)를 K에 더한다.

      3. 모든 자릿수에 관해 과정 a ~ b를 반복하고 K 값을 출력한다.

슈도코드

코드 구현 - 파이썬

코드 구현 - 자바

Last updated