조합 예제 - 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부터 N자리까지 미리 계산한다.
소문제 1, K번째 순열 출력하기
K번째 순열 출력하기
주어진 값(K)과 현재 자리수(N) - 1에서 만들 수 있는 경우의 수를 비교한다.
a번에서 K가 더 작아질 때까지 경우의 수를 배수(cnt)로 증가시킨다.(순열의 순서를 1씩 늘림)
K가 더 작아지면 순열에 값을 저장하고 K를
K = K - (경우의 수 * (cnt - 1))로 업데이트한다.순열이 완성될 때까지 a ~ c 과정을 반복하고 완료된 순열을 출력한다.
소문제 2, 입력된 순열의 순서 구하기
입력된 순열의 순서 구하기
현재 자릿수의 숫자를 확인하고 해당 숫자보다 앞 숫자 중 미사용 숫자를 카운트한다.
미사용 숫자 개수 * (현재 자리 - 1에서 만들 수 있는 순열의 개수)를 K에 더한다.모든 자릿수에 관해 과정 a ~ b를 반복하고 K 값을 출력한다.
슈도코드
코드 구현 - 파이썬
코드 구현 - 자바
Last updated