ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 개발자를 위한 수학 마스터 4회차: 순열과 조합 - 패스워드부터 알고리즘까지
    [프로그램]/Maths 2025. 9. 23. 14:50
    728x90

     

    "사용자 패스워드 정책을 어떻게 설계하면 안전할까요? 수학이 답을 알려드립니다!"

    *"함수형 프로그래밍 적용해봤는데 코드가 정말 깔끔해졌어요!"
    *"순수함수로 바꾸니까 테스트 코드 작성이 훨씬 쉬워지더라고요."*
    *"부수효과 분리하니까 디버깅할 때 어디서 문제인지 바로 찾을 수 있어요."

    지난주 3회차에서는 함수의 수학적 원리를 다뤘습니다. 이번 회차에서는 순열과 조합을 실무적 관점에서 정리합니다.
    "고등학교 때 배운 nPr, nCr 아닌가?" 하실 수 있지만, 실제로는 패스워드 보안, 알고리즘 최적화, 코딩 테스트에서 매일 쓰입니다.


    실무에서 마주치는 순열과 조합 문제들

    🔐 보안팀 요청 사례

    • 보안팀: "8자리 영문+숫자 조합 패스워드는 얼마나 안전한가요?"
    • 개발팀: "대충 많이 안전할 것 같은데요...? 🤔"

    이때 순열 계산을 모르면 "감"으로만 대답할 수밖에 없습니다.

    ⚡ 알고리즘 최적화

    // 5명 중 3명을 뽑는 모든 조합
    for (let i = 0; i < players.length; i++) {
      for (let j = i + 1; j < players.length; j++) {
        for (let k = j + 1; k < players.length; k++) {
          teams.push([players[i], players[j], players[k]]);
        }
      }
    }

    선수가 5명일 때는 괜찮지만, 50명이 되면?
    조합 공식을 알면 성능 한계를 쉽게 예측할 수 있습니다.


    순열(Permutation) vs 조합(Combination)

    • 순서가 중요하다 → 순열
    • 순서가 중요하지 않다 → 조합
    상황 순서 중요도 타입 실무 활용
    패스워드 생성 (ABC123 vs 123ABC) 중요 순열 보안 정책
    팀원 선발 (김철수, 이영희 vs 이영희, 김철수) 중요하지 않음 조합 리소스 할당
    API 엔드포인트 (/users/1/posts vs /posts/users/1) 중요 순열 라우팅
    기능 선택 (결제+배송 vs 배송+결제) 중요하지 않음 조합 기능 테스트

    수학 공식을 코드로 구현하기

    📐 순열 공식

    function permutation(n, r) {
      if (r > n || r < 0) return 0;
      let result = 1;
      for (let i = n; i > n - r; i--) result *= i;
      return result;
    }
    console.log(permutation(5, 3)); // 60

    📐 조합 공식

    function combination(n, r) {
      if (r > n || r < 0) return 0;
      r = Math.min(r, n - r);
      let result = 1;
      for (let i = 0; i < r; i++) result = result * (n - i) / (i + 1);
      return Math.round(result);
    }
    console.log(combination(5, 3)); // 10

    🔧 인터랙티브 데모 체험하기

    👉 🧮 순열과 조합 데모 페이지 바로가기

    • 패스워드 보안 강도 계산
    • 조합 생성 시뮬레이터
    • 브루트포스 공격 시간 예측
    • 단계별 시각화

    실무 활용 예시

    1. 패스워드 보안 강도 추정
      • estimateCrackingTime(8, 62) → 몇 시간
      • estimateCrackingTime(10, 94) → 수백만 년
    2. 테스트 케이스 생성 최적화
      • n개 기능 중 r개 조합 테스트 가능
    3. 알고리즘 복잡도 예측
      • C(10, 3) = 120 → 빠름
      • C(20, 10) = 184,756 → 느림
      • C(30, 15) = 155,117,520 → 매우 느림

    최적화 & 주의사항

    • 큰 수 계산 시 BigInt 필요
    function bigCombination(n, r) {
      if (r > n - r) r = n - r;
      let result = 1n;
      for (let i = 0; i < r; i++) {
        result = result * BigInt(n - i) / BigInt(i + 1);
      }
      return result;
    }

    정리

    • 순열/조합 판단 핵심: "순서가 중요한가?"
    • 보안 정책: 문자 집합과 길이의 지수적 관계
    • 알고리즘 성능: 조합 수 계산으로 예측 가능
    • 최적화: 불필요한 팩토리얼 제거

    다음 예고

    5회차: "점화식과 동적 프로그래밍 - 피보나치부터 최적화까지"

    • 점화식으로 복잡도 분석
    • DP 원리 & 메모이제이션
    • 캐시 전략, DB 쿼리 최적화 실습
    728x90

    댓글

Designed by Tistory.