Published on

코딩테스트 수학함수

Authors
  • avatar
    Name
    Hyo814
    Twitter
// 수학 기본 이론: 경우의 수, 순열, 조합

/**
 * 팩토리얼 계산
 * @param {number} n - 정수
 * @returns {number} - n!
 */
function factorial(n) {
  if (n <= 1) return 1
  return n * factorial(n - 1)
}

/**
 * 경우의 수 계산 (총 n개의 항목에서 r개를 선택하는 모든 경우의 수)
 * @param {number} n - 전체 항목 수
 * @param {number} r - 선택할 항목 수
 * @returns {number} - 경우의 수
 */
function combinationsCount(n, r) {
  return factorial(n) / (factorial(r) * factorial(n - r))
}

/**
 * 순열 계산 (총 n개의 항목에서 순서를 고려하여 r개를 선택하는 경우)
 * @param {number} n - 전체 항목 수
 * @param {number} r - 선택할 항목 수
 * @returns {number} - 순열 수
 */
function permutationsCount(n, r) {
  return factorial(n) / factorial(n - r)
}

/**
 * 조합 생성 (실제 조합 리스트)
 * @param {number[]} arr - 입력 배열
 * @param {number} r - 선택할 항목 수
 * @returns {number[][]} - 가능한 모든 조합
 */
function generateCombinations(arr, r) {
  const result = []
  function backtrack(start, current) {
    if (current.length === r) {
      result.push([...current])
      return
    }
    for (let i = start; i < arr.length; i++) {
      current.push(arr[i])
      backtrack(i + 1, current)
      current.pop() // 백트래킹
    }
  }
  backtrack(0, [])
  return result
}

/**
 * 순열 생성 (실제 순열 리스트)
 * @param {number[]} arr - 입력 배열
 * @param {number} r - 선택할 항목 수
 * @returns {number[][]} - 가능한 모든 순열
 */
function generatePermutations(arr, r) {
  const result = []
  function backtrack(current, used) {
    if (current.length === r) {
      result.push([...current])
      return
    }
    for (let i = 0; i < arr.length; i++) {
      if (used[i]) continue
      used[i] = true
      current.push(arr[i])
      backtrack(current, used)
      current.pop() // 백트래킹
      used[i] = false
    }
  }
  backtrack([], Array(arr.length).fill(false))
  return result
}

// 테스트 데이터
const n = 5,
  r = 3
console.log(`팩토리얼(${n}):`, factorial(n))
console.log(`경우의 수(${n}, ${r}):`, combinationsCount(n, r))
console.log(`순열(${n}, ${r}):`, permutationsCount(n, r))
console.log('조합:', generateCombinations([1, 2, 3, 4, 5], 3))
console.log('순열:', generatePermutations([1, 2, 3], 2))

// -----------------------------------------------
// JavaScript의 Math 관련 함수 정리
// -----------------------------------------------

// 상수
console.log('Math.PI:', Math.PI) // 원주율
console.log('Math.E:', Math.E) // 자연로그의 밑

// 기본 함수
console.log('Math.abs(-5):', Math.abs(-5)) // 절댓값
console.log('Math.sqrt(16):', Math.sqrt(16)) // 제곱근
console.log('Math.pow(2, 3):', Math.pow(2, 3)) // 거듭제곱
console.log('Math.round(4.5):', Math.round(4.5)) // 반올림
console.log('Math.ceil(4.2):', Math.ceil(4.2)) // 올림
console.log('Math.floor(4.8):', Math.floor(4.8)) // 내림
console.log('Math.max(1, 2, 3):', Math.max(1, 2, 3)) // 최댓값
console.log('Math.min(1, 2, 3):', Math.min(1, 2, 3)) // 최솟값

// 삼각 함수
console.log('Math.sin(Math.PI / 2):', Math.sin(Math.PI / 2)) // 사인
console.log('Math.cos(0):', Math.cos(0)) // 코사인
console.log('Math.tan(Math.PI / 4):', Math.tan(Math.PI / 4)) // 탄젠트

// 난수 생성
console.log('Math.random():', Math.random()) // 0 ~ 1 사이 난수

// 로그
console.log('Math.log(Math.E):', Math.log(Math.E)) // 자연 로그
console.log('Math.log10(1000):', Math.log10(1000)) // 로그(base 10)