프론트엔드로 가는 길/프로그래머스
32. 프로그래머스_구슬을 나누는 경우의 수
woody-j
2023. 2. 1. 16:00
코딩일지
작성자 | |||
성 명 | 최주희 | 작성일자 | 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. 필요한 조건 정리
2. 풀이단계 정리
|
하나하나 모든 걸 풀어가며 풀었던 문제 였던 것 같다. 어려운 듯 쉬웠다. 더 쉬운 공식을 사용하는 방법을 몰라서 어려웠고 어떤 식으로 쓰면 될지 감이 와서 쉬웠다. 하지만 내 식은 너무나 길었고 다른 풀이를 보고 너무나도 대단하다는 생각이 들었다. 저런 식을 보고 항상 저렇게 풀 수 있구나 생각이 드는데 왜 항상 그런 생각을 하면서 왜 저런 생각이 잘 나지 않는 걸까 하는 의문이 든다. 아마도 더 많은 문제들을 접해봐야겠지…? 재귀 함수는 정말 어렵지만 정말 효율적인 함수 인 것 같다. 꼭 기억해둬야겠다. |
||