16강 / 20강

비둘기집 원리 — 세어 보지 않고도 아는 것

너무 당연해서 강력한 원리

비둘기집 원리 — 세어 보지 않고도 아는 것
비둘기 10마리, 집 9개. 어느 집에는 반드시 두 마리가 들어갑니다.

비둘기 10마리를 집 9개에 넣으면, 적어도 한 집에는 두 마리 이상이 들어갑니다. 너무 당연하죠? 그런데 이 당연한 말이 놀라운 결론들을 만들어 냅니다.

비둘기집 원리 — n개의 물건을 k개의 상자에 넣으면 (n > k), 적어도 한 상자에는 ⌈n/k⌉개 이상이 들어간다.

비결은 무엇을 비둘기로, 무엇을 집으로 볼 것인가를 정하는 데 있습니다. 그것만 정하면 나머지는 자동이에요.

🕊️
비둘기
넣는 것 (사람, 값, 경우)
🏠
집
분류 기준 (나머지, 칸, 종류)
💥
결론
겹치는 것이 반드시 있다
세어 보지 않고도 '반드시 있다'를 말할 수 있습니다.
Python 브라우저에서 실행

🎮 비둘기를 집에 넣어 보세요

비둘기 수와 집 수를 조절하며 언제 충돌이 확정되는지 확인해 보세요. 무작위로 넣어 보는 버튼을 누르면 실제로도 늘 겹친다는 걸 볼 수 있습니다.

비둘기집 실험실 — 충돌은 피할 수 없습니다
불러오는 중…

해시 충돌은 피할 수 없습니다

10강에서 해시 함수는 단사가 아니라고 했죠. 이제 왜 그럴 수밖에 없는지 증명할 수 있습니다.

  • 비둘기 = 가능한 입력 (비밀번호, 파일, 문자열… 무한히 많음)
  • 집 = 해시 값 (SHA-256이라도 2²⁵⁶개, 유한함)

무한을 유한에 넣으므로 충돌은 반드시 존재합니다. 좋은 해시 함수의 목표는 "충돌이 없게" 만드는 것이 아니라 — 그건 불가능하니까 — 충돌을 찾기 어렵게 만드는 것입니다.

이름 9개, 칸 8개 — 비둘기집 원리가 충돌을 보장합니다.
Python 브라우저에서 실행
'적어도 하나'는 여집합으로. 13강에서 배운 그대로입니다.
Python 브라우저에서 실행
집을 '나머지'로 잡는 것이 이 문제의 열쇠입니다.
Python 브라우저에서 실행
🤔 확인 문제
서랍에 검정 양말 10짝, 흰 양말 10짝이 섞여 있습니다. 어두운 방에서 같은 색 한 켤레를 확실히 만들려면 최소 몇 짝을 꺼내야 할까요?
🤔 확인 문제
해시 충돌이 원리적으로 피할 수 없는 이유는?
🤔 확인 문제
생일이 같은 두 사람이 있을 확률이 50%를 넘는 최소 인원은? (윤년 무시)