JAVASCRIPT/코딩테스트
[프로그래머스] 0단계 - 구슬을 나누는 경우의 수
예글
2024. 1. 22. 15:37
1. 문제 설명
Hint
- 확실히 입문 들어오니까 수학적인 문제가 많이 보인다... 저 느낌표 저거 너무 오랜만에 봐서 이름도 까먹었다,, 팩토리얼 너,, 이놈,, 내가 학창시절 때 많이 싫어했었다,,
- 팩토리얼 개념도 까먹어서 도저히 어떻게 푸는 문젠지 접근조차 불가능해 구글링을 해 가장 내가 이해하기 좋은 답안들을 가지고 왔다
2. 답안 1
function solution(balls, share) {
let x = 1
let y = 1
let z = 1
for(let i = 1; i <= balls; i++){
x *= i
}
for(let i = 1; i <= (balls - share); i++){
y *= i
}
for(let i = 1; i <= share; i++){
z *= i
}
return Math.round(x / (y * z))
}
- 힌트에 나와있는 그대로를 구현한 답안
- 팩토리얼이 1부터 n까지를 곱해주는 것이기에 for문을 사용해서 곱한 후 나누어주기
- Math.round를 사용하는 이유 : 소수점 오류가 생겨서
자바스크립트에서는 소수점 오류가 생기는 이유는 실수를 이진수로 변환(부동소수점)해서 연산하기 때문이다.
10진법으로 계산하는 우리와 다르게 컴퓨터는 2진법으로 연산하는데,
2진수로 정확하게 표현할 수 없는 일부 10진수 값들은 정확한 값이 아닌 근사값으로 저장돼
반올림 오차가 생기기 때문이다.
예를 들어, 우리가 생각하기에 0.1 * 10 은 1이지만
부동소수점 형식, 즉, 2진수로 0.1을 정확히 나타낼 수 없기 때문에 생기는 반올림 오차로
1에 도달하지 못하고 0.9999999999999999와 같은 값이 나올 수 있다.
(물론 컴퓨터의 메모리 한계로 소수점 아래가 자릿수가 무한대로 생기진 않고 유한소수로 저장한다)
3. 답안 2
const 팩토리얼 = (num) => num === 0 ? 1 : num * 팩토리얼(num - 1)
function solution(balls, share) {
return Math.round(팩토리얼(balls) / 팩토리얼(balls - share) / 팩토리얼(share))
}
- 재귀함수를 이용한 답안
- 팩토리얼이 1이 될 때까지 계속 돌려돌려 돌림판~~
- 정처기 공부할 때 재귀함수 문제 푸는 거 좋아했는데 막상 내가 직접 구현해야하니까 어렵네...
갈 길이 멀지만 파이팅 해야지!!