본문으로 건너뛰기
김신건의 로그

확률 (Probability)

· 수정 · 📖 약 4분 · 1,345자/단어 #algorithm #math #probability #combinatorics
probability, 확률, 확률론, 조건부 확률, 베이즈 정리

정의

확률 (Probability) 은 사건이 발생할 가능성을 수치화한 값. 표본 공간 Ω 에 대해 P(A) = |A| / |Ω| (동일 확률), 또는 더 일반적으로는 σ-algebra 위의 측도론 정의. 알고리즘 문제에서는 주로 조합론적 확률 + 조건부 확률 + 기댓값 선형성 으로 수식화.

문제 상황과 동기

“확률적 사건” 을 모델링해야 하는 모든 문제 (카드 뽑기, 주사위, 랜덤 이동, 기댓값 DP).

  • naive: 모든 경우를 직접 시뮬레이션. O(2^N) 또는 무한 상태.
  • 확률 공식: 조건부 확률, 독립성, 전확률 공식, 베이즈를 이용해 수식 단순화. O(N) ~ O(N²).

핵심 통찰: 덧셈 원리, 곱셈 원리, 여사건, 조건부 확률 으로 경우의 수를 기하급수적으로 줄일 수 있다. 기댓값 선형성 으로 복잡한 랜덤 변수도 분해.

PS 에서는 모듈러 역원 (mod 10^9+7) 로 분수 확률을 정수화하는 패턴이 자주 등장.

시각화

핵심 아이디어

기본 공리

  1. 비음성: P(A) ≥ 0
  2. 정규화: P(Ω) = 1
  3. 덧셈: A ∩ B = ∅ ⇒ P(A ∪ B) = P(A) + P(B)

조건부 확률

P(A | B) = P(A ∩ B) / P(B)

사건 B 가 일어났다는 전제 하에 A 의 확률. 표본 공간을 B 로 축소.

독립성

P(A ∩ B) = P(A) · P(B) ⟺ A, B independent

전확률 공식 (Law of Total Probability)

P(A) = Σᵢ P(A | Bᵢ) · P(Bᵢ)

B₁, B₂, … 가 partition (서로 배타, 합집합 Ω).

베이즈 정리

P(A | B) = P(B | A) · P(A) / P(B)

원인-결과 역전. 조건부 확률 계산에 핵심.

기댓값 선형성

E[X + Y] = E[X] + E[Y]

독립이 아니어도 성립. 복잡한 확률 변수를 분해하는 강력한 도구.

알고리즘

동일 확률 (uniform):
  P(A) = |A| / |Ω|

조건부 확률:
  P(A | B) = P(A ∩ B) / P(B)

베이즈:
  P(A | B) = P(B | A) · P(A) / P(B)

기댓값:
  E[X] = Σ x · P(X = x)
  E[aX + bY] = a·E[X] + b·E[Y]

구현

// 모듈러 확률: 분수 p/q → p·q⁻¹ (mod M)
// fermat little: q⁻¹ = q^(M-2) mod M (M prime)
#include <bits/stdc++.h>
using namespace std;
const long long MOD = 1e9 + 7;

long long power(long long a, long long n) {
  long long r = 1;
  for (; n; n >>= 1, a = a * a % MOD)
      if (n & 1) r = r * a % MOD;
  return r;
}
long long inv(long long x) { return power(x, MOD - 2); }

int main() {
  // 문제: 동전 n 번 던져 앞면 k 번 나올 확률 (C(n, k) / 2^n) mod M
  int n, k; cin >> n >> k;
  
  // C(n, k) 계산
  long long num = 1, den = 1;
  for (int i = 0; i < k; i++) {
      num = num * (n - i) % MOD;
      den = den * (i + 1) % MOD;
  }
  long long nCk = num * inv(den) % MOD;
  
  // 2^n
  long long pow2n = power(2, n);
  
  // 확률 = C(n, k) / 2^n
  long long prob = nCk * inv(pow2n) % MOD;
  cout << prob << "\n";
}
stdin
5 2
결과
500000007
0.312500

복잡도

항목
조합 계산O(k) 시간 (C(n, k) 반복문)
거듭제곱 (modular)O(log n) 시간 (이진 지수)
역원O(log MOD) 시간 (페르마 소정리)
공간O(1)

기댓값 DP 는 문제별로 O(N) ~ O(N²).

조건부 확률과 베이즈 정리

조건부 확률 예시

문제: 두 주사위를 던져 합이 7 일 때, 첫 번째 주사위가 3 일 확률?

  • B = “합이 7” → 경우 (1,6), (2,5), (3,4), (4,3), (5,2), (6,1) 총 6 개
  • A = “첫 번째 3” ∩ B = (3, 4) 총 1 개
  • P(A | B) = 1/6

베이즈 정리 예시

문제: 질병 발병률 0.1%, 검사 정확도 99%. 양성이 나왔을 때 실제 병일 확률?

P(병 | 양성) = P(양성 | 병) · P(병) / P(양성)
P(양성) = P(양성 | 병)·P(병) + P(양성 | 건강)·P(건강)
        = 0.99 · 0.001 + 0.01 · 0.999 ≈ 0.01098
P(병 | 양성) ≈ 0.99 · 0.001 / 0.01098 ≈ 0.090 (약 9%)

직관과 다르게 낮은 prior 때문에 양성이어도 실제 병일 확률은 9% 정도.

기댓값 선형성 활용

문제: 길이 n 순열에서 i < j 인데 a[i] > a[j] 인 쌍 (inversion) 의 기댓값?

  • 각 쌍 (i, j) 가 inversion 일 확률 = 1/2
  • 전체 쌍 개수 = C(n, 2) = n(n-1)/2
  • E[inversion] = Σ P(i, j inversion) = n(n-1)/4

독립이 아니어도 선형성으로 기댓값 분해 가능.

변형 / 활용

기법설명
확률 DPdp[i] = i 상태에서 목표까지 기댓값 / 확률
마르코프 체인상태 전이 확률 행렬, 정상 분포
기댓값 트릭E[X] = Σ P(X ≥ k) (비음 정수 X)
포아송 근사희귀 사건 다량 시행
중심극한정리평균값 분포 정규화 (PS 에서 드묾)

함정

1. 조건부 확률 착각

P(A | B) ≠ P(B | A). 베이즈 정리 없이 직접 뒤집으면 틀림.

2. 독립성 가정

사건이 실제로는 독립이 아닌 경우 P(A ∩ B) = P(A) · P(B) 쓰면 오답.

3. mod 역원 존재

MOD 가 소수일 때만 페르마 소정리 적용. 합성수면 확장 유클리드.

4. 0 나누기

P(A | B) 계산시 P(B) = 0 이면 정의 안 됨. 분기 필요.

5. 실수 정밀도

확률을 double 로 계산할 때 누적 오차. 분수 또는 모듈러 정수로 정확 계산.

BOJ 연습 문제

번호제목정답률링크
BOJ 13430여러분의 노력에 박수를-kokoa-lab
BOJ 1467수 지우기-kokoa-lab
BOJ 16235나무 재테크 (시뮬 + 기댓값)-kokoa-lab
BOJ 1725히스토그램-kokoa-lab

참고

이 글의 용어 (4개)
수학 (Mathematics)algorithm
정의 수학 (Mathematics) 은 문제 해결에 필요한 모듈러 산술 (modular arithmetic), 최대공약수/최소공배수 (GCD/LCM), 거듭제곱 (exponent…
조합론 (Combinatorics)algorithm
정의 조합론 (Combinatorics) 은 유한 집합의 원소를 세는 수학 분야. PS 에서는 주로 순열 (Permutation), 조합 (Combination), 이항계수 (B…
Expected Value: 기댓값, Linearityalgorithm
정의 확률변수 X 의 기댓값: $$ E[X] = \sumx x \cdot P(X = x) \quad \text{(discrete)} $$ $$ E[X] = \int x \cdot…
Markov Chain: 상태 전이 확률algorithm
정의 Markov Chain 은 다음 상태가 오직 현재 상태에만 의존하는 확률 과정. memoryless property. 전이확률 행렬 P: P[i][j] = P(다음 = j …

💬 댓글

사이트 검색 / 명령어

검색

스크롤 = 확대/축소 · 드래그 = 이동 · 0 = 원래 크기 · ESC = 닫기