순열 본문
* 순서를 지켜서 일렬로 나열하는 경우의 수
* n개에서 r개를 택하여 나열하는 경우의 수 -> nPr 이라고 표현
* 순열은 순서를 따지지만, 조합은 따지지 않는다
* nPr = n(n-1)(n-2) ... (n-r+1) 단, (0 < r <= n)
* 팩토리얼을 통해 나타낼 수 있다
nPr = n! / (n-r)!
* 원리를 따지면서 생각하면 쉽다
ex) 4P2은 4개중에서 2개를 순서대로 고른다 ( 모든 경우의 수 )
-> 4*3*2*1 / 2*1 ( 고르지 않은 나머지 2개의 중복을 제거한다 )
abcd
모든 경우의 수 4! = ( ab ac ad ba bc bd ca cb cd da db dc ) * (ab 일때 cd와 dc , ac 일때 bd와 db ...... dc일때 ab와 ba -> 계속 2가지의 경우의 수가 있다 )
따라서 중복을 제거
ex) 5P3은 5개중에서 3개를 순서대로 고른다 ( 모든 경우의 수 )
-> 5*4*3 / 2*1 ( 고르지 않은 나머지 2개의 중복을 제거한다 )
모든 경우의 수 5! = ( abc abd abe acb acd ace adb adc ade aeb aec aed ... eda edb edc ) * (abc 일때 de와 ed , abe 일때 cd와 dc ...... edc일때 ab와 ba -> 계속 2가지의 경우의 수가 있다 )
따라서 중복을 제거
ex) 8P5은 8개중에서 5개를 순서대로 고른다 ( 모든 경우의 수 )
-> 8*7*6*5*4 / 3*2*1 ( 고르지 않은 나머지 3개의 중복을 제거한다 )
* 정리는 노트에 기록함
* jupyter notebook ( python 3 )
<< 복붙용 코드 >>
* nPr
numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
result=1
# for 문을 사용해서 n! / n-r! 을 range 함수로 구현
# -> n * (n-1) * (n-2) ... (n-r+1) 까지 곱해진다
for n in range(numN, (numN-numR),-1): # 하나씩 차감하면서 진행, numN > numR, 10-4 = 6 이지만, range 함수 특성상 1개 전까지 시행
print('n : {}'.format(n))
result = result * n
print('result : {}'.format(result))
* 원순열 , (n-1)! for문으로 만들기
numN = int(input('numN 입력: '))
result = 1
for i in range(1,numN):
result *= i
print('loops:{}'.format(i))
print('result:{}'.format(result))