데이터

제로베이스 데이터사이언스 스쿨 - Part 03. 기초 수학-20

Leah (리아) 2025. 11. 7. 15:47
반응형

 Chapter 02. 기초수학 문제풀이

 

순열과 조합 (Python 수학 알고리즘 실습)

 

주요 개념

이번 학습에서는 경우의 수를 계산하는 기본 개념
순열(Permutation)조합(Combination) 을 Python 코드로 구현했다.

  • 순열 : 서로 다른 n개 중 r개를 순서 있게 나열하는 경우의 수
    → 수식: nPr = n! / (n - r)!
  • 조합 : 서로 다른 n개 중 r개를 순서 상관없이 선택하는 경우의 수
    → 수식: nCr = n! / (r! × (n - r)!)

두 개념 모두 팩토리얼 연산을 기반으로 계산된다.


1. 순열 (Permutation)

💡 개념 정리

예를 들어 9개의 수 중 4개를 순서 있게 배열하는 경우의 수는

9P4 = 9 × 8 × 7 × 6 = 3024

즉, 앞에서부터 r개만 곱하는 구조다.


코드 예시

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

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

print(f'result: {result}')

 

실행 결과

numN 입력: 9
numR 입력: 4
n: 9
n: 8
n: 7
n: 6
result: 3024

 

range(numN, numN - numR, -1) 을 이용하면 뒤로 감소하며
필요한 항까지만 곱할 수 있다.


응용 예시 - 카드 순열 문제

“카드 7장을 나열할 때, 2·4·7번 카드가 반드시 이웃하도록 배치하는 경우의 수”

이 경우 2·4·7을 하나의 묶음(블록) 으로 보면,
총 5개의 블록을 나열하는 경우의 수 × 내부 3장의 순서 경우의 수로 계산된다.

즉, 5! × 3! = 720 × 6 = 4320가지

이처럼 순열 개념은 묶음형 배치 문제에도 자주 쓰인다.


2. 조합 (Combination)

💡 개념 정리

조합은 순서와 관계없이 선택하는 경우의 수이다.
예: 9개의 수 중 4개를 뽑는 경우

9C4 = 9! / (4! × 5!) = 126


코드 예시

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

resultP = 1  # n!
resultR = 1  # r!
resultC = 1

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

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

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

 

실행 결과

numN 입력: 9
numR 입력: 4
resultC: 126

 

순열 계산 후 r!로 나누면 조합의 결과가 된다.


카드 확률 문제 예시

카드 7장 중 3장을 선택했을 때, 3·4·5번이 동시에 선택될 확률은?

전체 경우의 수: 7C3 = 35
특정 조합(3·4·5)이 선택될 경우: 1
→ 확률 = (1 / 35) × 100 = 2.86%

 

Python으로 구현:

 
numN = 7
numR = 3

resultP = 1
resultR = 1

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

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

resultC = int(resultP / resultR)
prob = (1 / resultC) * 100

print(f'전체 조합 수: {resultC}')
print(f'특정 조합 확률: {round(prob, 2)}%')

 

실행 결과

 
전체 조합 수: 35  
특정 조합 확률: 2.86%

 

* 이 글은 제로베이스 데이터사이언스 파트타임 스쿨의 강의 자료 일부를 발췌하여 작성되었습니다.


 

💡 생각 정리

이번 학습을 통해

  • 순열 → 순서가 중요할 때,
  • 조합 → 순서가 중요하지 않을 때
    사용해야 함을 명확히 이해했다.

또한 range()의 감소 반복 구조, result *= n의 누적 곱, 그리고 팩토리얼 기반 수학식의 구현 흐름을 자연스럽게 익힐 수 있었다.


🚀 적용점

 

  • 순열: 자리 배치, 암호 경우의 수, 조합형 UI 설계
  • 조합: 확률 계산, 데이터 샘플링, 통계적 조합 문제
  • 확률 문제 확장: (특정 조합 / 전체 조합) × 100 으로 실전 문제에 응용 가능

 

반응형