기초 수학(3)

이상해씨·2021년 9월 25일
0

자료구조, 알고리즘

목록 보기
10/20

◾순열

  • 순열(nPr) : 순서있게 n 개에서 r개를 선택하여 나열하는 경우의 수
    • nPr = n (n-1) (n-2) ... (n-r+1), (단, 0 < r <= n)
    • 1 2 3 4 : 4P2
      • 1 (2 / 3 / 4) : 3가지
      • 2 (1 / 3 / 4) : 3가지
      • 3 (1 / 2 / 4) : 3가지
      • 4 (1 / 2 / 3) : 3가지
      • 12가지 : 4 * 3 = 12
  • 순열은 팩토리얼(계승)을 이용해서 나타낼 수 있다.
    • nPr = n! / (n-r)!
# 입력 : n, r
# 출력 : nPr

# 반복 사용 : n! / (n-r)! = n!(n-1)!...(n-r+1)!
# 따라서 n ~ n-r+1의 범위만큼 반복을 통해 계산
result = 1
for n in range(numN, numN-numR, -1):
    print('n : {}'.format(n))
    result = result * n
    
# 재귀 사용
# n!, (n-r)!을 구한뒤 나누어 계산
def factorialFunc(n):
    if n == 1 or n == 0 :
        return 1
    else :
        return n * factorialFunc(n-1)
result = int(factorialFunc(numN) / factorialFunc(numN-numR))
  • 원 순열 : 시작과 끝의 구분이 없는 순열(위치가 달라도 절대적인 순서가 같다면 같은 것으로 취급한다.)
    • 1 2 3
    • (1 2 3), (1 3 2), (2 1 3), (2, 3, 1), (3, 1, 2), (3, 2, 1)
      • (1 2 3) == (2 3 1), (3 1 2)
      • (1 3 2) == (2 1 3), (3 2 1)
    • 원 순열 : n!/n = (n-1)!
# 입력 : n, r
# 출력 : 원 순열(n, r)

# 반복 사용 : 1 ~ n-1의 범위만큼 반복하며 계산
result = 1
for i in range(1, n):
    result *= i

◾조합

  • 조합(nCr) : 순서에 상관없이 n개에서 r개를 택하는 경우의 수
    • nCr = nPr / r! = n!/(r! * (n-r)!)
    • 1 2 3
      • 1 (2 3) : 2가지
      • 2 (3) : 1가지
      • 3 ( ) : 0가지
      • 3 가지 : 3! / (2! * 1!) = 3
# 입력 : n, r
# 출력 : nCr

resultP = 1  # nPr
resultR = 1  # r!
resultC = 1  # nPr / r!
# 반복 사용
for n in range(numN, numN-numR, -1):
    resultP *= n
for n in range(numR, 0, -1):
    resultR *= n
resultC = int(resultP / resultR)

◾확률

  • 확률 : 모든 사건에서 특정 사건이 일어날 수 있는 수를 나타낸 것
    • 표본 공간 : 모든 사건
    • 사건 : 특정 사건
    • 동전 예시
      • 표본 공간 : 앞, 뒤 2가지
      • 특정 사건 : 앞-1가지, 뒤-1가지
      • 확률 : 앞-1/2, 뒤-1/2
    • 주사위
      • 표본 공간 : 1, 2, 3, 4, 5, 6 6가지
      • 특정 사건 : 1-1가지, 2-1가지, 3-1가지, ..., 6-1가지
      • 확률 : 1-1/6, 2-1/6, 3-1/6, ..., 6-1/6
  • 조합을 이용한 확률 계산
    • 뽑기 : 꽝 4장, 선물 3장
    • 3장을 뽑는 전체 경우의 수 : 7C3 = 7P3 / 3! = 35
    • 3장을 뽑는 각 경우의 수의 확률
      • 꽝 0, 선물 3 : 3C3 / 35 = 1 / 35
      • 꽝 1, 선물 2 : (4C1 * 3C2) / 35 = 12 / 35
      • 꽝 2, 선물 1 : (4C2 * 3C1) / 35 = 18 / 35
      • 꽝 3, 선물 0 : 4C3 / 35 = 4 / 35
# 확률 실습
# 조합을 구하는 함수를 구현하여 활용
def comFunc(): 
    numN = int(input('n 입력 : '))
    numR = int(input('r 입력 : '))
    resultP = 1
    resultR = 1
    resultC = 1

    for n in range(numN, numN-numR, -1):
        #print('n : {}'.format(n))
        resultP *= n
    #print('resultP : {}'.format(int(resultP)))
    for n in range(numR, 0, -1):
        #print('n : {}'.format(n))
        resultR *= n
    #print('resultR : {}'.format(int(resultR)))
    resultC = int(resultP / resultR)
    #print('resultC : {}'.format(resultC))

    return resultC
# 표본 공간
sample = comFunc()
print('sample : {}'.format(sample))
# 꽝을 뽑는 사건
event1 = comFunc()
print('event1 : {}'.format(event1))
# 선물을 뽑는 사건
event2 = comFunc()
print('event2 : {}'.format(event2))
# 해당 사건이 일어날 확률
probability = event1 * event2 / sample * 100
print('probability : {:.2f}%'.format(probability))
profile
후라이드 치킨

0개의 댓글