프로그래머스에서 테스트 실행은 통과하는데 일부 케이스에서 오류가 생겨 제출하지 못했다.
문제
구슬을 나누는 경우의 수
머쓱이는 구슬을 친구들에게 나누어주려고 합니다. 구슬은 모두 다르게 생겼습니다. 머쓱이가 갖고 있는 구슬의 개수
balls와 친구들에게 나누어 줄 구슬 개수 share이 매개변수로 주어질 때, balls개의 구슬 중 share개의 구슬을 고르는
가능한 모든 경우의 수를 return 하는 solution 함수를 완성해주세요.
제한사항
- 1 ≤ balls ≤ 30
- 1 ≤ share ≤ 30
- 구슬을 고르는 순서는 고려하지 않습니다.
- share ≤ balls
입출력 예
balls | share | result |
3 | 2 | 3 |
5 | 3 | 10 |
나의 풀이
function solution(balls, share) {
let a = 1
for(let i = balls ; i > 0 ; i--) {
a *= i
}
let b = 1
for(let j = share ; j > 0 ; j--) {
b *= j
}
let c = 1
for(let k = balls - share ; k > 0 ; k--) {
c *= k
}
console.log(a, b, c)
return a / b / c
}
for 문을 돌면서 balls!, share!, (balls-share)! 를 구하고 return에서 나눈 값을 반환했다.
문제 상황
해결책
return Math.round(a / (b * c)) 으로 변경해준다.
알게된 점
자바스크립트에서 소수점 숫자 연산을 하면, 오류가 발생할 때가 있다. 예를 들어, 0.1 + 0.2 = 0.30000000000000004가 된다.
- 원인
컴퓨터는 계산을 '2진법'을 사용하기 때문에, 10진법을 2진법으로 바꾸는 변환과정이 필요한데 이때 소수 중 일부는 무한소수가 된다.
하지만 컴퓨터 메모리에 한계가 있어서 무한 소수를 다 담지 못하고 중간에 잘라서 유한 소수로 저장한다. 이 과정에서 오차가 발생한다.
- 해결방안 : 소수를 정수로 만드는 메서드를 사용하자!
1. toFixed() 메서드
입력받은 숫자를, 매개변수만큼 자리수를 반올림해 String으로 반환해주는 함수이다. 매개변수를 2로 지정해주면 소수점 둘째자리까지 반올림하고, 3으로 지정해주면 소수점 셋째자리까지 반올림한다. 0~20까지 입력 가능하며, 디폴트값은 0이기 때문에 toFixed()만 입력하면 소수를 정수로 만들 수 있다.
String으로 반환하기 때문에 'number'타입으로 사용하고 싶다면 Number() 메서드를 한번 더 사용해서 숫자로 변환해줘야 한다.
let a = (0.2+0.5).toFixed(2); // '0.30'
Number(a); // 0.3
2. Math.round() 메서드
반올림을 해주는 함수이다. 매개변수로 들어온 값을 반올림한 후, 가장 가까운 정수 값을 반환한다.
Math.round(20.49); // 20
Math.round((0.1 + 0.2) * 10) / 10; // 0.3
'TIL' 카테고리의 다른 글
React_redux 설정 (0) | 2023.04.28 |
---|---|
React _ ToDoList (0) | 2023.04.19 |
2023.04.05_코딩테스트 연습 (0) | 2023.04.05 |
2023.04.05_js_야구게임 (0) | 2023.04.05 |
2023.04.04_js_일급 객체로서의 함수 (0) | 2023.04.05 |