[2주차] 기초수학 7

이철민·2023년 2월 9일

[수열]

  • 피보나치 수열: 세번째 항은 두 번째 항과 첫 번째 항을 더한 합니다. (단, a1=1, a2=1이고 n>2일때)
  • an = a (n-2) + a (n-1)
# 피보나치 수를 계산하시오

inputN = int(input('n 입력: '))

valueN = 0
sumN = 0

valuePreN2 = 0
valuePreN1 = 0

n = 1
while n <= inputN:
    if n == 1 or n == 2:
        valueN = 1
        valuePreN2 = valueN
        valuePreN1 = valueN

        sumN += valueN
        n += 1

    else:
        valueN = valuePreN2 + valuePreN1
        valuePreN2 = valuePreN1
        valuePreN1 = valueN
        sumN += valueN
        n += 1

print('{}번째 항의 값: {}'.format(inputN, valueN))
print('{}번째 항까지의 합: {}'.format(inputN, sumN))
  • 팩토리얼: 1부터 양의 정수 n까지의 정수를 모두 곱한 것
    • 0! 은 1로 약속한다.
# 반복문을 이용하는 경우

inputN = int(input('n 입력: '))

result = 1
for n in range(1,(inputN+1)):
    result *= n

print('{}팩토리얼: {}'.format(inputN, result))

------------------------------------------

# 재귀 함수를 이용하는 경우

inputN = int(input('n 입력: '))

def factorialFun(n):
    if n == 1:
        return 1
    else:
        return n * factorialFun(n-1)

print('{} 팩토리얼: {}'.format(inputN, factorialFun(inputN)))
------------------------------------------------

# 팩토리얼 모듈 이용

inputN = int(input('n 입력: '))
import math
print('{}팩토리얼: {}'.format(inputN, math.factorial(inputN)))
  • 군수열: 여러 개의 항을 묶었을 때 규칙성을 가지는 수열
# 50번째 항의 수를 구하시오
1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5
=> (1), (1,2), (1,2,3), (1,2,3,4) (1,2,3,4,5)

1) 각 군의 항의 개수가 등차 수열
2) 각 군의 항의 개수의 총합을 구하면 그게 몇번째 항까지 왔는지 알 수 있음.
# n번째 항의 값을 출력하는 프로그램을 만들자
# 1, 1, 2, 1, 2, 3, 1, 2, 3, 4, 1, 2, 3, 4, 5

# n은 군의 개수, nCnt는 항, searchN은 구하고자 하는 항의 값

inputN = int(input('n항 입력: '))

flag = True
n = 1; nCnt = 1; searchN = 0

while flag:
    for i in range(1,(n+1)):
        if i == n:
            print('{} '.format(i), end='')
        else:
            print('{}, '.format(i), end='')

        nCnt += 1
        if nCnt > inputN:
            searchN = i
            flag = False
            break

    print()
    n += 1

print('{}항: {}'.format(inputN, searchN))

[순열]

  • 순열: n개에서 r개를 택하여 나열하는 경우의 수
    -> nPr = n(n-1)(n-2) ... (n-r+1)
    -> nPr = n! / (n-r)!

  • 원순열: 시작과 끝이 구분이 없는 순열
    -> 공식: n!/n or (n-1)!
# 4명의 친구가 원탁 테이블에 앉을 수 있는 순서

n = int(input('친구 수 입력: '))
result = 1
for i in range(1,n):
    result *= i

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

[조합]

  • 조합: n개의 수에서 r개를 택하는 경우의 수
    • 조합에서 순서는 중요하지 않다. 순열과의 차이점
    • nCr = nPr / r! = n! / r!(n-r)!
# 8C3, 7C5 다음 조합들의 값을 구하는 프로그램을 만들어보자.
# 공식 =  n! / r!(n-r)!   ->  8P3을 먼저 구한 후, r! 을 구해서 나누어주면 됨.

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

resultP = 1     # nPr
resultR = 1     # r!
resultC = 1     # nCr

# 순열 구하기(nPr)
for n in range(numN,(numN-numR), -1):
    print('n: {}'.format(n))
    resultP *= n

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

# r! 구하기
for n in range(numR, 0, -1):
    print('n: {}'.format(n))
    resultR *= n

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

# 조합 구하기(nCr)
resultC = int(resultP / resultR)
print('resultC: {}'.format(resultC))

# 확률 구하기
result = (1/resultC) * 100
print('{}%'.format(round(result, 2)))
  • 확률: 모든 사건에서 특정 사건이 일어날 수 있는 수
    • 모든 사건 -> 표본 공간
    • 특정 사건 -> 사건
    • 조합을 이용해서 확률을 알아낼 수 있다.
# 박스에 '꽝' 종이 4장, '선물' 종이 3장.  '총 7장에서 꽝 2장과 선물 1장을 뽑을 확률 출력'

def proFun():
    numN = int(input('numN 입력: '))
    numR = int(input('numR 입력: '))

    resultP = 1
    resultR = 1
    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))

    return resultC

sample = proFun()
print('sample: {}'.format(sample))

event1 = proFun()
print('sample: {}'.format(event1))

event2 = proFun()
print('sample: {}'.format(event2))

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

[오늘의 느낀점]

돌아서면 까먹고, 돌아서면 까먹는데, 나는 금붕어인가..!
그래도 어제 팀스터디 퀵OT에서 운영 매니저님이 해주신 말이 큰 힘이 됐다.
아직 파이썬 설치한지 갓 일주일이다. 어려운게 당연한거니 힘내보자!

profile
늘 온 마음을 다해 :)

0개의 댓글