본문바로가기
[코딩수학] 코딩으로 '순열과 조합' 정복하기
수학동아 2019.08.07 17:46

 

코딩 수학 8번째 시간입니다. 다들 코딩을 이용해 수학 문제를 효율적으로 풀고 계신가요? 간단한 수학 문제는 손으로도 풀고 코딩으로도 풀 수 있지만, 실생활 문제나 어렵고 복잡한 함수가 포함된 수학 문제는 손으로 풀기 어려운 경우가 많아요. 코딩을 활용하면 쉽게 해결할 수 있으니 열심히 익히고 활용해 보세요~. 

이번 달부터는 코딩 난이도를 대폭 낮췄습니다. 코딩 명령어를 익힌 뒤 해당 코딩 명령어로 풀 수 있는 수학 문제를 찾아 댓글로 달고 친구들과 토론해 보세요.

 

 

 

 

경우의 수를 구하는 ‘순열과 조합

 

 

이번에 코딩으로 정복해 볼 수학 개념은 ‘순열과 조합’이에요. 순열과 조합을 처음 체계적으로 연구한 사람은 17세기에 활동한 프랑스 수학자 블레즈 파스칼로, 도박에서 승률의 기댓값을 계산하던 중 순열과 조합을 발견했어요. 이 내용을 수학자 피에르 드 페르마에게 소개하면서 세상에 알려지게 됐죠.

 

순열과 조합을 처음 연구한 블레즈 파스칼(1623~1662).

파스칼

순열은 어떤 대상을 순서를 부여해 나열하는 것을 뜻합니다. 예를 들어 각각 A, B, C가 적힌 카드 3장을 순서를 고려해 나열하는 방법은 (A, B, C), (A, C, B), (B, A, C), (B, C, A), (C, A, B). (C, B, A)로 경우의 수가 총 6가지죠.

순열의 가짓수를 구할 때마다 일일이 나열해야 한다면 귀찮겠죠? 수학에서는 ‘팩토리얼(!)’을 이용해 쉽게 계산합니다. n 팩토리얼(n!)은 1부터 n까지의 자연수를 모두 곱한 값으로, 서로 다른 카드 3장을 순서를 고려해 나열하는 순열의 가짓수를 구하고 싶으면 처음에 올 수 있는 카드가 3장, 두 번째에 2장, 세 번째에 1장이므로 3!=3x2x1=6로 쉽게 구할 수 있어요.

비슷하게 n개 중 k개를 고른 뒤 순서대로 나열하는 경우의 수도 팩토리얼로 구할 수 있습니다. 수학 기호로는 nPk로 나타내고 \frac{n!}{(n-k)!}로 계산하면 됩니다.  

 

 

조합은 순서를 고려하지 않고 단순히 ‘고르는 걸’ 뜻합니다. 예를 들어 순열은 (A, B)와 (B, A)를 구분해 2개로 세지만, 조합은 순서를 고려하지 않기 때문에 1개로 셉니다. 조합의 수를 구하고 싶으면 먼저 순열의 수를 구한 뒤, 겹치는 수만큼 나눠주면 됩니다. 서로 다른 n개 중 k개를 고르는 조합의 수는 nCk로 나타내며 \frac{_{}nP_{k}}{k!}로 계산할 수 있죠. 이 식을 팩토리얼로 나타내면 \frac{n!}{k!(n-k)!} (단, n\geq r)입니다. 이번 호에서는 순열과 조합을 계산하는 코딩 명령어를 이용해 경우의 수를 쉽게 구해보도록 해요!

 

 

.

.

.

.

.

순열과 조합

순열과 조합

순열과 조합

순열과 조합

factorial, binomial

 

 

순열과 조합을 하는 코딩 명령어는 아래와 같다. 명령어의 구조를 이해한 뒤 Sage 코딩창에 명령어를 입력해 값을 구해보자.

 

 

 

 

<1> 명령어 살펴보기

 

n!을 직접 계산하려면 곱하기를 n-1번 해야 한다. 또, n이 10만 돼도 값이 3628800이어서 시간이 오래 걸린다. factorial() 명령어의 괄호 안에 n 값만 입력하면 쉽게 값을 구할 수 있다.

 

\LARGE n!=n   imes (n-1)   imes (n-2)   imes \cdots    imes 2   imes 1 

factorial(n)

 

 

n개 중 k개를 골라 나열하는 순열의 수는 팩토리얼 명령어와 나누기 명령어 /를 이용해 구할 수 있다. 분자의 괄호 안에 n, 분모의 괄호 안에 n-k를 입력하면 된다.

 

\large _{}nP_{k}=\frac{n!}{(n-k)!}=n   imes (n-1)   imes (n-2)   imes \cdots    imes (n-k+1) 

factorial(n)/factorial(n-k)

 

 

❸ 팩토리얼 명령어로 조합의 수를 구하려면 복잡하다. n개 중 k개를 고르는 조합의 수를 구할 때는 binomial() 명령어를 쓰자. 괄호 안에 nk를 쉼표로 구분해 순서대로 적으면 곧바로 값을 구할 수 있다.

 

\large _{}nC_{k}=\frac{n!}{k!(n-k)!}=\frac{n   imes (n-1)   imes (n-2)   imes \cdots    imes (n-k+1)}{k   imes (k-1)   imes \cdots    imes 2   imes 1   imes (n-k)   imes (n-k-1)   imes \cdots   imes 2   imes 1}

binomial(n,k)

 

 

 

 

<2> Sage에서 명령어 실행하기

 

 

 

 

 

 

 

<3> 교과 연계 코너

 

아래 도로망에서 A를 출발해 B로 가는 최단 경로는 몇 가지일까? 오른쪽으로 가는 행동을 R, 아래로 가는 행동을 D라고 하면 A에서 B로 가는 최단 경로는 R 4개, D 3개를 배열하는 방법과 같다. R과 D를 합쳐 문자 7개를 배열하는 방법은 7!인데 R과 D가 각각 4개, 3개씩 겹치므로 4!X3!로 나누면 된다. 즉, \large \frac{7!}{4!   imes 3!}=35가지이다.

 

 

 

 

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

 

★도전 문제☆

도전 문제

① binomial 명령어를 이용해 아래 파스칼의 법칙이 성립하는지 확인해보자.

파스칼의 법칙

\large _{99}C_{7}+_{99}C_{8}=_{100}C_{8}

 

 

factorialbinomial 명령어로 해결할 수 있는 문제를 찾아 댓글을 달고 친구들과 어떻게 답을 구할 수 있을지 토론해보자.

 

 

 

-끝-

 

 

 

  •  
    je Lv.1 2019.08.07 19:14

    도박에서 순열과 조합을 발견했다니 흥미롭네요!ㅎㅎ 역시 코딩을 이용해서 수학문제를 푸는건 재밌는거 같아용

    댓글 작성하기 좋아요0 댓글수0
  •  
    이용현 Lv.1 2019.08.07 21:55

    순열과 조합을 코딩으로 풀어낼 수 있다는 것에 대해서 신기하다고 생각해요 ㅎㅎ 

    쉽게 설명 해주셔서 이해가 잘 가는 것 같습니다. ^^

    댓글 작성하기 좋아요0 댓글수0
  •  
    디듀우 Lv.1 2019.08.08 11:31

    문제) 1번부터 10번까지 10명의 서로 다른 학생이 모두 서로 다른 가방과 서로 다른 소지품 하나씩을 내려놓는다. 학생들이 가방에 소지품을 담아 멜 때, 그 누구도 자신의 가방을 메거나 자신의 소지품을 가져가지 않는 방법의 수는 얼마일까?

    댓글 작성하기 좋아요1 댓글수1
    •  
      zozohaini Lv.2 2019.09.18 22:39

      정복가늘?

      좋아요0
  •  
    zozohaini Lv.2 2019.09.18 22:39 비밀댓글
    비밀 댓글이 등록 되었습니다.
    댓글 작성하기 댓글수0
  •  
    신양기 테스트324 Lv.4 2019.09.20 14:07
    확인요청중

    포인트 3

    댓글 작성하기 좋아요0 댓글수0
  •  
    조가현 Lv.4 2019.09.24 09:20 비밀댓글
    확인요청중
    비밀 댓글이 등록 되었습니다.
    댓글 작성하기 댓글수1
    •  
      조가현 Lv.4 2019.09.24 09:21 비밀댓글
      비밀 댓글이 등록 되었습니다!
  •  
    Lv.3 2019.09.24 10:38 비밀댓글
    확인요청중
    비밀 댓글이 등록 되었습니다.
    댓글 작성하기 댓글수2
    •  
      Lv.3 2019.09.24 10:38 비밀댓글
      비밀 댓글이 등록 되었습니다!
    •  
      수학동아 Lv.3 2020.02.28 13:48

      ㅇㅇ

      좋아요0
  • 폴리매스 문제는 2019년도 정부의 재원으로 한국과학창의재단의 지원을 받아 수행된 성과물입니다.

  • ☎문의 02-6749-3911