[데이터사이언스12기-스터디노트] 파이썬(23.02.13.)

도윤수·2023년 2월 13일
0

Python스터디노트

목록 보기
12/16
post-thumbnail

📝스터디노트 12일차 범위

기초 수학7(순열, 조합, 확률)

📖 순열

‣ 순열이란? 순서에 상관있으면서, n개에서 r개를 택하여 나열하는 경우의 수
‣ nPr 로도 표현할 수 있다.
‣ n! / (n-r)! 으로 계산하면 된다.

# 8P3, 7P5를 구하는 프로그램을 만들어보자.

numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
result = 1

for n in range(numN, (numN - numR), -1): #8,3을 입력하면 6까지 범위가 설정된다.
    print('n : {}'.format((n)))
    result = result * n

print('result: {}'.format(result))
  1. n 값과 r 값을 받았고,
  2. for문이라 numN 부터 numN - numR , -1 로 하나씩 줄여나가면 numN-numR+1 까지 돈다

‣ 원순열이란? 시작과 끝의 구분이 없는 순열, 일렬로는 같지만 원으로 만들면 다르다.
‣ n! / n 이나 (n-1)!로 구할 수 있다.

# {1,2,3}이라면 {123}{132}{321}등 6가지가 나온다.
# n! / n 이나 (n-1)!로 구할 수 있다.

# n명의 친구가 원탁 테이블에 앉을 수 있는 순서를 계산한다.
n = int(input('친구 수 입력: '))
result = 1
for i in range(1, n):   # (n-1)까지 돌아야하는데 for문이라 n을 입력하면 n-1까지 돌아간다.
    result *= i

print('result: {}'.format(result))


1. 일렬로 봤을 때 순서가 같으면 사실상 같지만, 원으로 둘렀을 때 조금 달라진다.
2. 그러므로 노란색은 노란색끼리, 초록색은 초록색끼리 사실상 일렬로 봤을 때 같다.

📖 조합

‣ 조합이란? 순서 상관없이 n개에서 r개를 택하는 경우의 수
‣ n개에서 r개 고를 때 3개 중 2개라면 순열 = 6가지(3!), 조합 = 3가지(3!/2!) 이다.
‣ 조합 nCr = nPr / r! 과 같다. 즉 n! / r!(n-r)! 이다.

순열의 경우


1. 순서가 상관있기 때문에 24가지 경우가 나온다.
2. 4 팩토리얼이기 때문에

조합의 경우

#다음 조합들의 값을 구하는 프로그램을 만들어보자.  nPr / r! 방식
numN = int(input('numN 입력: '))
numR = int(input('numR 입력: '))
resultP = 1 # 순열 값 저장
resultR = 1 # r! 값 저장
resultC = 1 # 조합 값 저장

for n in range(numN, (numN - numR), -1): #8,3을 입력하면 6까지 범위가 설정된다.
    print('n : {}'.format((n)))
    resultP = resultP * n   #여기까진 순열 구하는 코드

print('resultP: {}'.format(resultP))

for n in range(numR, 0, -1):    # 0 바로앞인 1까지 반복.
    print('n : {}'.format((n)))
    resultR = resultR * n   #여기까지 r! 구하는 코드

print('resultR: {}'.format(resultP))

resultC = int(resultP / resultR)    # nPr / r! 로 구하는 코드
print('resultC: {}'.format(resultC))


# 카드 5장 중 2장을 선택했을 때 삼각형과 사각형이 동시에 선택될 수 있는 확률은? -> 좌우 바뀌는애들도 1가지로 침
result = (1/resultC) * 100  # 조합이고 전체 중 1가지이고 퍼센티지라 * 100
print('{}%'.format(round(result, 2)))


1. 순열과 똑같이 반복하며 P 값은 곱하면서 내려오고,
2. R 값도 1까지 곱하면서 내려온 후,
3. nPr / r! 로 구하기 위해 P 값 / R 값을 해주고 C에 넣어준다.
4. 그 중 카드 2장이 동시에 선택되는 것은 앞뒤가 바뀌는 것까지 1장으로 보기때문에 전체 중 1가지 경우이고 1/resultC * 100 으로 퍼센티지를 만들어주어 round로 2번째 자리에서 올려준다.

📖 확률

‣ 확률이란? 모든 사건에서 특정 사건이 일어날 수 있는 수를 나타낸 것.

예제로 어떤 박스에 선물 3개와 꽝 4개가 들어있는데, 이 중 각각 1개와 2개에서 뽑힐 확률 구하는 프로그램 -> 3번 반복되야함.

def proFun():
    numN = int(input('numN 입력: '))
    numR = int(input('numR 입력: '))
    resultP = 1 # 순열 값 저장
    resultR = 1 # r! 값 저장
    resultC = 1 # 조합 값 저장

    for n in range(numN, (numN - numR), -1): #먼저 순열을 구해준다.
        resultP = resultP * n   #여기까진 순열 구하는 코드
    print('resultP: {}'.format(resultP))

    for n in range(numR, 0, -1): #먼저 순열을 구해준다.
        resultR = resultR * n   #여기까진 순열 구하는 코드
    print('resultR: {}'.format(resultR))

    resultC = int(resultP / resultR)
    print('resultC: {}'.format(resultC))    #여기까지 확률 함수로 묶이고 3번 반복해야한다.

    return resultC

sample = proFun()   # sample은 모든 사건의 값이다.
print('sample: {}'.format(sample))

event1 = proFun()   # 꽝이 나올 사건
print('event1: {}'.format(event1))

event2 = proFun()   # 선물이 나올 사건
print('event2: {}'.format(event2))

probability = (event1 * event2) / sample
print('probability: {}%'.format(round(probability * 100, 2)))

확률 구하는 프로그램


1. 조합을 구하는 과정까지는 코드가 같다.
2. 전체 경우의 수, 꽝이 나올 경우의 수, 선물이 나올 경우의 수를 구해야해서 조합 코드가 3번 반복되어야하는데,
3. 길게 늘여쓸 필요없이 def를 사용하여 함수를 만들어버렸다. def proFun()
4. proFun()함수를 사용하여 sample(전체경우), event1(꽝), event2(선물)의 확률을 구해주고,
5. (꽝 선물) / 전체 100 으로 확률을 구해준다.

★ 어려웠던 점, 새로웠던 점 ★
1. 손으로 계산할 때 쉬운 공식이 있고, 코드를 작성할 때 쉬운 공식이 있다.

  1. 반복되는 작업이고 같은 코드가 반복되는 부분이라면 과감하게 def 로 함수화 시키자
    ⇨ 함수를 호출할 때 마다 print가 한 줄 되는 것이니 헷갈리지말고 sample, event1, event2 구분.

  2. 조합, 순열, 확률 같은 문제는 어떤 공식을 사용할지, 얼마나 반복되는지 확인해두고 짜는게 좋을 것 같다.

🔥🔥바쁜시간 쪼개서 매일매일 성장해 나가는 모습을 기록하자🔥🔥

profile
DataScience를 하고 싶은 DoIT

0개의 댓글