[zero-base/] DS Part 2. 기초 수학 - 12일차 스터디 노트

손윤재·2023년 12월 19일

제로베이스 DS 22기

목록 보기
13/55
post-thumbnail

1. 수열

수열이란, 규칙성을 가지고 나열되어 있는 수들을 의미한다.


💠 등차수열

등차 수열이란, 연속된 두 항의 차이(공차d)가 일정한 수열을 의미한다.

  • 첫번째 항(a1a_1), 공차(dd)를 입력받아 nn번째 항의 값(ana_n)을 출력

    inputA1 = int(input('a1 입력: '))
     inputD = int(input('공차 입력: '))
     inputN = int(input('n 입력: '))
    
     # 첫 번째 항 등록
     valueN = inputA1
     
     # 두 번째 항부터 n항까지 공차를 더해간다.
     for n in range(2, inputN + 1):          
          valueN += inputD
    
     print('{}번째 항의 값: {}'.format(inputN, valueN))
  • 등차 수열 일반항 공식을 이용해서 n번째 항의 값(an)을 출력

       일반항: an=a1+(n1)d~~~일반항 :~ a_n = a_1 + (n-1)d

    inputA1 = int(input('a1 입력: '))
     inputD = int(input('공차 입력: '))
     inputN = int(input('n 입력: '))
     
     valueN = inputA1 + (inputN - 1) * inputD 👈
     
     print('{}번째 항의 값: {}'.format(inputN, valueN))
  • 첫번째 항(a1a_1), 공차(dd)를 입력받아 nn번째 항까지의 합(SnS_n)을 출력
    입렵받은 첫번째 항(a1a_1)과 첫번째 항까지의 합(S1S_1)은 먼저 대입한 후 for문을 돌린다.

    inputA1 = int(input('a1 입력: '))
     inputD = int(input('공차 입력: '))
     inputN = int(input('n 입력: '))
    
     valueN = inputA1
     sumN = valueN
     
     for n in range(2, inputN + 1):
          
          valueN += inputD
          sumN += valueN
    
     print('{}번째 항까지의 합: {}'.format(inputN, sumN))
  • 등차 수열 합 공식을 이용해서 nn번째 항까지의 합(SnS_n)을 출력

       등차수열의 합: Sn=n(a1+an)2~~~등차수열의~합 :~ S_n = \frac{n(a_1 + a_n)}{2}

    inputA1 = int(input('a1 입력: '))
     inputD = int(input('공차 입력: '))
     inputN = int(input('n 입력: '))
     
     valueN = inputA1 + (inputN - 1) * inputD
     sumN = inputN * (inputA1 + valueN) / 2 👈
     
     print('{}번째 항까지의 합: {}'.format(inputN, int(sumN)))

💠 등비수열

등비 수열이란, 연속된 두 항의 비가 일정(공비r)한 수열이다.

  • 첫번째 항(a1a_1), 공비(rr)를 입력받아 n번째 항의 값(ana_n)을 출력

    inputA1 = int(input('a1 입력: '))
     inputR = int(input('공비 입력: '))
     inputN = int(input('n 입력: '))
    
     # 첫 번째 항 등록
     valueN = inputA1
     
     # 두 번째 항부터 n항까지 공비를 곱해간다.
     for n in range(2, inputN + 1):          
          valueN *= inputR
    
     print('{}번째 항의 값: {}'.format(inputN, valueN))
  • 등비 수열 일반항 공식을 이용해서 nn번째 항의 값(ana_n)을 출력

       일반항: an=a1×r(n1)~~~일반항 :~ a_n = a_1 \times r^{(n-1)}

    inputA1 = int(input('a1 입력: '))
     inputR = int(input('공비 입력: '))
     inputN = int(input('n 입력: '))
     
     valueN = inputA1 * (inputR ** (inputN - 1)) 👈
     
     print('{}번째 항의 값: {}'.format(inputN, valueN))
  • 첫번째 항(a1a_1), 공차(dd)를 입력받아 n번째 항까지의 합(SnS_n)을 출력
    입렵받은 첫번째 항(a1a_1)과 첫번째 항까지의 합(S1S_1)은 먼저 대입한 후 for문을 돌린다.

    inputA1 = int(input('a1 입력: '))
     inputR = int(input('공비 입력: '))
     inputN = int(input('n 입력: '))
    
     valueN = inputA1
     sumN = valueN
     
     for n in range(2, inputN + 1):          
          valueN *= inputR
          sumN += valueN
    
     print('{}번째 항까지의 합: {}'.format(inputN, sumN))
  • 등비 수열 합 공식을 이용해서 nn번째 항까지의 합(SnS_n)을 출력

       등차수열의 합: Sn=a1(1rn)1r~~~등차수열의~합 :~ S_n = \frac{a_1(1 - r^n)}{1-r}

    inputA1 = int(input('a1 입력: '))
     inputD = int(input('공차 입력: '))
     inputN = int(input('n 입력: '))
     
     sumN = inputA1 * (1 - (inputR ** inputN)) / (1 - inputR) 👈
     
     print('{}번째 항까지의 합: {}'.format(inputN, int(sumN)))

💠 시그마

시그마 ∑ 란, 수열의 합을 나타내는 기호이다.

등차 수열의 합: Sn = k=1n a1 + (k1)d                                                              등차~수열의~합:~S_n~= ~\sum_{k=1}^n~a_1~+~(k-1)d ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • k=110 2k 의 의미는?                                                                                                \sum_{k=1}^{10}~2 \cdot k~의 ~ 의미는?~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       : 첫번째 항이 2이고, 공차가 2인 등차 수열의 10번째 항까지의 합
등비 수열의 합: Sn = k=1n a1×r(k1)                                                                    등비~수열의~합:~S_n~= ~\sum_{k=1}^n~a_1 \times r^{(k-1)} ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
  • k=18 23(k1) 의 의미는?                                                                                                \sum_{k=1}^8~2 \cdot 3^{(k-1)}~의 ~ 의미는?~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
       : 첫번째 항이 2이고, 공비가 3인 등비 수열의 8번째 항까지의 합

💠 계차수열

계차 수열이란, 어떤 수열의 인접하는 두 항의 차로 이루어진 또 다른 수열이다.

  • 계차 수열(bn)의 (n1)번째 항까지의 합을 더해 an의 값을 구할  수 있다.계차~수열(b_n)의~(n-1)번째~항까지의~합을~더해~a_n의~값을~구할~~수~있다.

    an=a1 + k=1n1bk                        a_n = a_1 ~ + ~ \sum_{k=1}^{n-1} b_k ~~~~~~~~~~~~~~~~~~~~~~~~
  • 수열  an={3,  7,  13,  21,  31,  43,  57,  }의  n번째  항의  값을  출력       수열 ~~ a_n = \{3, ~~7, ~~13, ~~21, ~~31, ~~43, ~~57, ~~\cdots \}의~~n번째~~항의~~값을~~출력~~~~~~~

               bn={  4,   6,    8,   10,  12,  14,  }~~~~~~~~~~~b_n = \{~~4,~~~6,~~~~8,~~~10,~~12,~~14,~~\cdots \}

    inputA1 = 3 # an의 첫번째 항
     inputAN = 7 # an의 7번째 항의 값 출력
     inputB1 = 4 # bn의 첫번째 항
     inputBD = 2 # bn의 공차 d
    
     valueAN = inputA1
     valueBN = inputB1
     an = {1:inputA1}
     bn = {1:inputB1}
    
     for n in range(2, inputAN + 1):
         valueAN += valueBN
         valueBN += inputBD
         an[n] = valueAN
         bn[n] = valueBN
    
     print('an의 {}번째 항의 값: {}'.format(inputAN, valueAN))
     print(f'an = {list(an.values())}')
     del bn[inputAN]
     print(f'bn =   {list(bn.values())}')
     
     # 실행결과
     # an의 7번째 항의 값: 57
     # an = [3, 7, 13, 21, 31, 43, 57]
     # bn =   [4, 6, 8, 10, 12, 14]

💠 피보나치수열

피보나치 수열이란,
두 번째 전 항(an2a_{n-2})과 이전 항(an1a_{n-1})을 더한 합인 n 번째 항(ana_{n})을 나열한 수이다.

  • 피보나치 수열의 첫번째 항(a1a_1)과 두번째 항(a1a_1)을 1로 고정하고
    반복문을 이용해 n번째 항(ana_n)을 출력

    input_num = int(input('n 입력: '))
    
     fibonacci = [1, 1]
     value_pre1 = fibonacci[0]
     value_pre2 = fibonacci[1]
     value_an = 0
     sum_an = value_pre1 + value_pre2
    
     for n in range(3, input_num + 1):
         value_an = value_pre2 + value_pre1
         value_pre2 = value_pre1
         value_pre1 = value_an
         fibonacci.append(value_an)
         sum_an += value_an
    
     print('피보나치 수: {}'.format(fibonacci))
     print('{}번째 항의 값: {}'.format(input_num, value_an))
     print('{}번째 항까지의 합: {}'.format(input_num, sum_an))
  • 재귀함수를 이용해 피보나치 수열 구하기

      def fibonacciRecursion(n):
           if n <= 1: return n
           else:
               return fibonacciRecursion(n-2) + fibonacciRecursion(n-1)
    
       inputN = 8
       
       print('피보나치 수: { ', end='')
       for n in range(1, inputN):
           print(fibonacciRecursion(n), end=', ')
       print(fibonacciRecursion(inputN), '}')
       
       print(f'{inputN}번째 항의 값: {fibonacciRecursion(inputN)}')
       
       # 실행결과
       # 피보나치 수: { 1, 1, 2, 3, 5, 8, 13, 21 }
       # 8번째 항의 값: 21

💠 팩토리얼

팩토리얼이란, 1부터 양의 정수 n까지의 모든 정수를 곱한 수이다.
단, 0!1로 약속한다.

  • n!=1 × 2 ×  × (n2) × (n1) × nn! = 1~\times~2~\times~\cdots~\times~(n-2)~\times~(n-1)~\times~n

  • 반복문 이용

    inputN = int(input('n 입력: '))
    
     result = 1
     for n in range(1, inputN + 1):
         result *= n
    
     print('{} 팩토리얼: {}'.format(inputN, result))
  • 재귀함수 사용

    def factorial(n):
        if n == 0: 	return 1
        return n * factorial(n - 1)
        
     inputN = int(input('n 입력: '))    
     
     print('{} 팩토리얼: {}'.format(inputN, factorial(inputN)))
  • math 모듈 사용

    import math
    
     inputN = int(input('n 입력: '))    
     
     print('{} 팩토리얼: {}'.format(inputN, math.factorial(inputN)))





2. 경우의 수

💠 순열

순열이란, n개에서 r개를 선택하여 순서대로 나열하는 경우의 수이다.

  • nPr\textcolor{blue}{n\raisebox{0.15em}{P}r}n\textcolor{blue}n부터 (nr+1\textcolor{blue}{n-r+1})까지의 곱으로 구한다.

    numN = int(input('numN 입력: '))
     numR = int(input('numR 입력: '))
    
     result = 1
    
     for n in range(numN, (numN-numR), -1): 👈
         result *= n
    
     print('result: {}'.format(result))
  • 순열은 팩토리얼(계승)을 이용해서 나타낼 수 있다.

                nPr=n!(nr)!~~~~~~~~~~~~\textcolor{blue}{n\raisebox{0.15em}{P}r = \frac{\large n!}{\large (n-r)!}}

    import math
    
     numN = int(input('numN 입력: '))
     numR = int(input('numR 입력: '))
     
     result = int(math.factorial(numN) / math.factorial(numN - numR)) 👈
     print('result: {}'.format(result))

💠 조합

조합이란, n개에서 r개를 순서에 상관없이 선택하는 경우의 수이다.

   nCr=nPrr!=n!r!(nr)!~~~\large n\raisebox{0.15em}{C}r = \frac{n\raisebox{0.15em}{P}r}{\large r!} = \frac{\Large n!}{\large r!(n-r)!}

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

   resultP = 1
   resultR = 1
   resultC = 1

🚩 # nPr
   for n in range(numN, (numN-numR), -1):
       resultP *= n

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

🚩 # r!
   for n in range(numR, 0, -1):
       resultR *= n

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

🚩 # nCr = nPr/r!
   resultC = int(resultP / resultR)

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




profile
ISTP(정신승리), To Be Data Scientist

0개의 댓글