- 순열 이란?
순열은 순서가 가장 중요!
- n개에서 r개를 택하여 나열하는 경우의 수
{1, 2, 3, 4}
↓
2 1 1 1
1 3 2 3 3 2 4 2
4 4 4 3
순열에서 1,2 와 2,1 은 다르게 본다!
nPr = n(n - 1)(n - 2) ... (n - r + 1), (단 0 < r <= n)
n은 모든 항의 개수
r은 뽑아내는 수의 개수
4P2
- 순열은 팩토리얼(계승)을 이용해서 나타낼 수 있다.
n! / (n - r)!
- 실습1
다음 순열의 값을 구해보자.
nPr = n(n - 1)(n - 2) ... (n - r + 1)
8P3 → 8 7 (5 + 1) = 336
8!/ 5! → 8 7 6 5 4 3 2 1 / 5 4 3 2 1
7P5 →
7! → 7 6 5 4 3 2 1
5! → 5 4 3 2 * 1
- 실습2
카드 4장을 일렬로 나열하되 삼각형과 사각형이 서로 이웃하도록 나열하는 경우의 수를 구하자.
●▲■♠
▲■을 하나로 보고 총 3장으로 생각하고 계산한다!
3! = 6
▲■인 경우
■▲인 경우가 있으므로 곱하기 2를 해준다
3! * 2 = 12
- 파이썬을 이용해서 다음 순열들의 값을 구하는 프로그램을 만들어 보자.
8P3, 7P5
numN = int(input('numN 입력 : '))
numR= int(input('numR 입력 : '))
result = 1
# nPr = n(n-1)(n-2)...(n-r+1)
for n in range(numN, (numN - numR), -1): # n - r + 1 이 공식에서 맞지만, for문에서는 원래 -1 해주므로 상쇄 되므로 n - r로 한다
print('n : {}'.format(n))
result = result * n
print('result : {}'.format(result))
- 원 순열
시작과 끝의 구분이 없는 순열
{1, 2, 3}
↓
{1, 2, 3} {1, 3, 2}
{2, 1, 3} {2, 3, 1}
{3, 1, 2} {3, 2, 1}
↓
3!/3 → 2
→ n!/n or (n-1)!
- 4명의 친구가 원탁 테이블에 앉을 수 있는 순서를 계산해보자.
n = int(input('친구 수 입력 : '))
result = 1
for i in range(1, n): # for문에서는 -1을 원래 해주므로 공식에 있는 -1을 상쇄하여 그대로 n이 들어간다!
resutl *= i
print('result : {}'.format(result))
- 순서 상관없이 r개 선택하자!
n개에서 r개를 택하는 경우의 수
{1, 2, 3}
순열 = 순서 상관있이 r개 선택 6가지 경우 [1, 2][1, 3][2, 1][2, 3][3, 1][3, 2]
조합 = 순서 상관없이 r개 선택 3가지 경우 [1, 2][1, 3][2, 3] => [1, 2]나 [2, 1]을 똑같이 보는 것
- 4개에서 3개를 택하는 경우의 수
{1, 2, 3, 4}
순열의 경우 24가지 경우
조합의 경우 4가지 경우
순열과 조합
{1, 2, 3}
↓
3P2 = 3 2 = 6
3C2 = 3P2 / 2! = 3
{1, 2, 3, 4}
4P3 = 4 3 * 2 = 24
4C3 = 4P3 / 3! = 4
nCr = nPr / r! == n! / r!(n-r)! (단 0 < r <= n)
- 실습1
다음 조합의 값을 구해보자.
8C3
→ 8P3 / 3!
또는 8! / 3!(8-3)!
7C5
→ 7P5 / 5!
또는 7! / 3!(7-5)!
- 실습2
'카드 5장 중 2장을 선택했을 때 삼각형과 사각형이 동시에 선택될 수 있는 확률은?'
5C2
→5! / 2!(5-2)!
- 파이썬을 이용해서 다음 조합들의 값을 구하는 프로그램을 만들어 보자.
8C3
7C5
numN = int(input('numN 입력 : '))
numR = int(input('numR 입력 : '))
resultP = 1 # 순열
resultR = 1 # R!를 담을 변수
resultC = 1 # 최종값을 구할 변수
# 순열 구하는 부분
for n in range(numN, (numN - numR), -1): # 원래 포문에 -1붙으므로 numR에 따로 안해줌
print('n : {}'.format(n))
resultP = resultP * n
print('resultP : {}'.format(resultP))
# 분모 r 구하는 부분
for n in range(numR, 0, -1): # 0을 입력해야 0이전의 1까지 실행된다
print('n : {}'.format(n))
resultR = resultR * n
print('resultR : {}'.format(resultR))
# 순열을 r!로 나누는 부분
resultC = int(resultP / resultR)
print('resultC : {}'.format(resultC))
# 아래 실습 해답
result = (1/resultC) * 100
print('{}%'.format(round(result, 2)))
- 카드 5장 중 2장을 선택했을 때 삼각형과 사각형이 동시에 선택될 수 있는 확률은?
위 코드를 그대로 사용하면 된다
5C2
- 모든 사건에서 특정 사건이 일어날 수 있는 수를 나타낸 것.
[동전]
ㆍ모든 사건 : 앞, 뒤 → 2가지 경우
ㆍ특정 사건 : 앞 → 1가지 경우 , 뒤 → 1가지 경우
ㆍ확률 : 앞 → 1/2, 뒤 → 1/2
[주사위]
ㆍ모든 사건 : 1, 2, 3, 4, 5, 6 → 6가지 경우
ㆍ특정 사건 : 1 → 1가지 경우 , 2 → 1가지 경우, 3 → 1가지 경우, 4 → 1가지 경우, ...
ㆍ확률 : 1 → 1/6, 2 → 1/6, 3 → 1/6, 4 → 1/6, 5 → 1/6, 6 → 1/6
★ 모든 사건 → 표본 공간
★ 특정 사건 → 사건
- 확률과 조합
조합을 이용해서 확률을 알아낼 수 있다.
[뽑기]
박스에 '꽝'이 적힌 종이가 4장 있고, '선물'이 적힌 종이가 3장 있다.
3장을 뽑을 경우 다음 경우의 수를 구해보자.
[꽝][꽝][꽝][꽝][선물][선물][선물]
7장에서 3장을 뽑는 경우 7C3 = 35
꽝:0 선물:3 → (1)/35 # 선물이 총3개이므로 선물 3개를 뽑는 경우는 한 가지 따라서 1/35
꽝:1 선물:2 → (4C1 3C2) → (43)/35 → 12/35
꽝:2 선물:1 → (4C2 3C1) → (63)/35 → 18/35
꽝:3 선물:3 → (4C3)/35 → 4/35
- 박스에 '꽝'이 적힌 종이가 5장 있고, '선물'이 적힌 종이가 2장 있다.
3장을 뽑을 경우 다음 경우의 수를 구해보자.
[꽝][꽝][꽝][꽝][꽝][선물][선물]
꽝:3 선물:0 → (5C3)/35 → (10)/35
꽝:2 선물:1 → (5C2 2C1) / 35 → (102)/35 → 20/35
꽝:1 선물:2 → (5C1)/35 → (5)/35 → 5/35
이 글은 제로베이스 데이터 취업 스쿨의 강의자료 일부를 발췌하여 작성되었습니다.