본문 바로가기
프론트엔드로 가는 길/프로그래머스

32. 프로그래머스_구슬을 나누는 경우의 수

by woody-j 2023. 2. 1.

코딩일지

작성자
  최주희 작성일자 2022.02.01
세부 코딩 내용
활동 기간 2022.02.01
문제 머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수 balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는 가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
나의 풀이 function solution(balls, share) {
      let ballsResult = "1";
      let ballsShareResult = "1"
       let shareResult = "1"
for(let i=1; i<balls+1;i++){
        ballsResult*=i;
    }
    for(let i=1; i< (balls - share)+1;i++){
        ballsShareResult*=i;
    }
   for(let i=1; i<share+1;i++){
        shareResult*=i;
    }
 return ballsResult/(ballsShareResult*shareResult)
}
function solution(balls, share) {
      let ballsResult = "1";
      let ballsShareResult = "1"
       let shareResult = "1"
for(let i=1; i<balls+1;i++){
        ballsResult*=i;
    }
    for(let i=1; i< (balls - share)+1;i++){
        ballsShareResult*=i;
    }
   for(let i=1; i<share+1;i++){
        shareResult*=i;
    }
 return Math.round(ballsResult/(ballsShareResult*shareResult))
}
결과 몫이 소수점이 나오는 상황 오류 통과
다른 풀이 const 팩토리얼 = (num) => num === 0 ? 1 : num * 팩토리얼(num - 1)


function solution(balls, share) {
  return Math.round(팩토리얼(balls) / 팩토리얼(balls - share) / 팩토리얼(share))
}

function solution(balls, share) {
  const [n, m] = [balls, share];
  const fact = [BigInt(1), BigInt(1)];


  for (let i = 2; i <= n; i++) fact[i] = fact[i - 1] * BigInt(i);


  return Number(fact[n] / (fact[n - m] * fact[m]));
}


// 많은 사람들의 답
해석 재귀 함수 사용
키워드 코딩내용 생각

1. 필요한 조건 정리


  • •경우의 수 공식 풀어서 표현
  • •공식 중에 반복으로 계산해야하는 부분은 for문으로 계산








2. 풀이단계 정리


  • 곱하기 전 변수 기본값 1로 저장
  • 공식 중에 반복해서 계산해야하는 부분 for문으로 계산해서 변수에 저장
  • 공식을 풀어서 변수 대입
  • 소수점 나올 것을 생각하여 math메소드로 반올림
하나하나 모든 걸 풀어가며 풀었던 문제 였던 것 같다. 
어려운 듯 쉬웠다. 더 쉬운 공식을 사용하는 방법을 몰라서 어려웠고 어떤 식으로 쓰면 될지 감이 와서 쉬웠다.


하지만 내 식은 너무나 길었고 다른 풀이를 보고 너무나도 대단하다는 생각이 들었다. 저런 식을 보고 항상 저렇게 풀 수 있구나 생각이 드는데 왜 항상 그런 생각을 하면서 왜 저런 생각이 잘 나지 않는 걸까 하는 의문이 든다. 아마도 더 많은 문제들을 접해봐야겠지…?
재귀 함수는 정말 어렵지만 정말 효율적인 함수 인 것 같다.
꼭 기억해둬야겠다.