[Zero-Base DS]스터디노트_기초수학(02)

HAHAHAEUN·2024년 3월 20일

주요내용

1. 피보나치 수열

2. 팩토리얼

3. 군 수열

4. 순열

5. 조합

6. 확률

I. 피보나치 수열

  • 피보나치 수열: 처음 두 항을 1과 1로 한 후, 그 다음 항부터는 바로 앞의 두 개의 항을 더해 만드는 수열
  • 피보나치 수열 구하기
# 피보나치 수열에서 n1, n2 = 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
        # 한 바퀴 돌았을 때, 이전 n-2 = n-1, n-1 = n 됨

        sumN += valueN
        n += 1

print(f'{inputN}번째 항의 값: {valueN}')
print(f'{inputN}번째 항까지의 합: {sumN}')

출력 결과 :

II. 팩토리얼

  • 팩토리얼: 1부터 양의 정수 n까지의 정수를 모두 곱한 것
  • 팩토리얼 구하기(방법1. 반복문 사용)
# 1) 반복문 사용
inputN = int(input('n 입력: '))
result = 1
for n in range (1, inputN + 1):
    result *= n

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

출력 결과 :

  • 팩토리얼 구하기(방법2. 재귀 함수 사용)
# 2) 재귀 함수 이용 ( 나 자산을 다시 호출 )
inputN = int(input('n 입력: '))
def factorialFun(n):  # n = 변수
    if n == 1: return 1

    return n * factorialFun(n-1)

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

출력 결과 :

  • 팩토리얼 구하기(방법3. Python 모듈 사용/.factorial())
    • import math
    • math.factorial(팩토리얼을 구하고자 하는 숫자 입력)
inputN = int(input('n 입력: '))
import math
print(f'{inputN} 팩토리얼: {format(math.factorial(inputN), ',')}')

출력 결과 :

III. 군수열

  • 군수열: 여러 개의 항을 묶었을 때 규칙성을 가지는 수열
  • 예제 풀어보기
inputN = int(input('n항 입력: '))

flag = True
n = 1
nCnt = 1
# nCnt = 항의 순번(개수) => nCnt < inputN (should be)
searchNC = 0  # searchNP = 찾고자 하는 항의 분자값
searchNP = 0  # searchNP = 찾고자 하는 항의 분모값
while flag:

    for i in range(1, n + 1):  # for문은 '군'에 대한 반복문
        if i == n:
            print(f'{i}/{n-i+1}', end='')
        else:
            print(f'{i}/{n - i + 1},', end='')

        nCnt += 1
        if nCnt > inputN:
            searchNC = i
            searchNP = n - i + 1
            flag = False
            break
    print()
    n += 1

print('{}항: {}/{}'.format(inputN, searchNC, searchNP))

출력 결과 :

IV. 순열

  • 순열: n개에서 r개를 택하여 나열하는 경우의 수

    순열은 순서룰 고려함
    e.g. {1, 2} != {2, 1}

  • 순열은 팩토리얼(계승)을 이용해서 나타낼 수 있다
  • 예제 풀어보기(원순열 개념 적용)
n = int(input('친구 수 입력: '))
result = 1
for i in range(1, n):
# n+1이 아닌 n까지 한 이유는 n-1까지만 구하면 되기 때문
    result *= i

print(f'result: {result}')

출력 결과 :

V. 조합

  • 조합: n개에서 r개를 택하는 경우의 수

    순열과 다르게 조합은 순서룰 고려하지 않음
    e.g. {1, 2} == {2, 1}

  • 예제 풀어보기
# n개에서 r개를 택하는 경우의 수(순서 상관 x)
# nPr > nCr = nPr/r! = n!/r!(n-r)! 단, 0 < r <= n
# nPr = n!/(n-r)!

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

resultP = 1
resultR = 1
resultC = 1

for n in range (numN, numN - numR, -1):
    print(f'n: {n}')
    resultP *= n
print(f'resultP: {resultP}')

for n in range(numR, 0, -1):
    print(f'n: {n}')
    resultR *= n
print(f'resultR: {resultR}')

resultC = resultP / resultR
print(f'resultC: {int(resultC)}')

# 실습
# 카드 5장 중 2장을 선택했을 떄, 삼각형과 사각형이 동시에 선택될 수 있는 확률?
# 동그라미, 세모, 네모, 오각형, 육각형
# 5C2

result = (1/resultC) * 100
print(f'{round(result,2)}%')

출력 결과 :

VI. 확률

  • 확률: 모든 사건에서 특정 사건이 일어날 수 있는 수를 나타낸 것
  • 조합을 이용하여 확률을 알아낼 수 있다
  • 위 항목을 파이썬을 통해 구해보기
def proFun():

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

    resultP = 1
    resultR = 1
    resultC = 1

	for i in range(numN, numN - numR, -1):
        resultP *= i

    for i in range(numR, 0, -1):
        resultR *= i

    resultC = int(resultP/resultR)
    return resultC

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

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

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

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

출력 결과 :
(case1) (case2)

[자료 출처 : 제로베이스 데이터 취업스쿨]

profile
할 거면 제대로 하자

0개의 댓글