어제보다 뭐라도 더 알자

공부를 정리하고, 재사용하기 위한 블로그입니다. 잘못된 부분이있다면 댓글로 알려주세요~~

자바 스크립트 공부

자바스크립트 전체 n개 중에서 a개를 순서없이 뽑는 경우의 수

chord 2022. 12. 14. 16:40
320x100

https://school.programmers.co.kr/learn/courses/30/lessons/120840

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

구슬을 나누는 경우의 수

문제 설명

머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.

저의 풀이

/**
 * 공식
 * 전체 n개 중에서 a개를 순서없이 뽑는 경우의 수
 * n * (n-1) * (n -2) 를  a개 만큼 진행한 값(분자) 나누기
 * a * (a - 1) * (a - 2) 를 a가 1이 될때까지 진행한 값(분모)
 *
 * numerator(분자)의 초기 값을 balls(곱하기 때문에 초기값이 0이면 0만 나온다)
 * denominator(분모)의 초기 값을 share (곱하기 때문에 초기값이 0이면 0만 나온다)
 * for 반복문에 i를 1부터 share보다 작은 범위로 설정합니다.
 * 0이 아니라 1인 이유는 분자 분모의 값에 이미 초기 값이 들어가있기 때문입니다.
 * 위의 공식처럼 진행 합니다.
 *
 * numerator / denominator를 리턴합니다.
 */
function solution(balls, share) {
  let numerator = balls;
  let denominator = share;

  for (let i = 1; i < share; i++) {
    numerator *= balls - i;
    denominator *= share - i;
  }
  return numerator / denominator;
}

다른 분들의 풀이

const helpFunc = (num) => (num === 0 ? 1 : num * helpFunc(num - 1));

function solution(balls, share) {
  return Math.round(
    helpFunc(balls) / helpFunc(balls - share) / helpFunc(share)
  );
}

helpFunc 들어온 파라미터(num 넘이라 칭함)이 0이면 1을 리턴하고 끝내지만 0이 아니라면 넘 * 넘 -1을 수행합니다

수행 하다가 넘이 0이면 1을 리턴하고 끝납니다.

 

320x100