개발로그필름

[프로그래머스] 구슬을 나누는 경우의 수 javascript 본문

coding test/프로그래머스

[프로그래머스] 구슬을 나누는 경우의 수 javascript

yuullog 2023. 4. 24. 14:00
728x90
반응형
SMALL

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

 

프로그래머스

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

programmers.co.kr

 

 

문제

 

 

나의 문제 풀이

function solution(balls, share) {  	
    return Math.round(factorial(balls) / (factorial((balls-share)) * factorial(share)))
}

function factorial(n) {
      let result = 1;
      for (let i = 1; i <= n; i++) {
        result = result * i;
      }
      return result;
}

factorial 함수를 따로 만들어 수학 공식을 이용해 풀었다

Math.round()를 쓰지 않아 몇몇 결과가 통과되지 않아 애를 먹었는데

js의 소수점 오류를 원인으로 들 수 있다

콘솔창을 열어 0.1 + 0.2를 입력하면 우리가 흔히 생각하는 답인 0.3이 아닌  0.30000000000000004가 나오는 걸 확인 할 수 있다

이와 같은 오류가 생기는 이유는 우리는 계산할 때 10진법을 사용하지만 컴퓨터는 2진법을 사용하기 때문이라고 할 수 있다

따라서 10진법을 2진법으로 바꿀 때 컴퓨터 내부에서 소수 중 일부가 무한 소수가 되어 버리는 경우가 있다

하지만 컴퓨터 메모리는 무한 소수를 다 표현 할 수 없기 때문에 중간에 잘라 유한 소수가 돼서 끝에 04로 끝나게 돼서 우리 눈에 출력되어 보여진다

 

이와 같은 오류를 해결 할 수 있는 방법은

1. toFixed() 사용

입력받은 숫자를 매개변수만큼 자리수를 반올림해 String으로 반환

(매개변수는 소수점 몇 번째까지 나타낼지. 0부터 20까지 입력 가능)

var result = (0.1 + 0.2).toFixed(2); 
// 소수점 두자리까지 나타낸다
// '0.30'  ===> String 타입 


// 숫자로 변환하고 싶다면 Number() 메서드 사용해주기!!
Number(result); 
// 0.3    ===> Number 타입

 

 

2. Math.round() 사용

2023.01.31 - [IT/JavaScript] - [JS] Math.floor(), Math.ceil(), Math.round() 개념과 예제

 

[JS] Math.floor(), Math.ceil(), Math.round() 개념과 예제

Math.floor() 주어진 숫자와 같거나 작은 정수 중에서 가장 큰 수를 반환 console.log(Math.floor(6.9)); // 6 console.log(Math.floor(5.05)); // 5 console.log(Math.floor(10)); // 10 console.log(Math.floor(-5.05)); // -6 Math.ceil() 주어

yuujungg.tistory.com

예전에 썼던 글이 있는데 참고!!!

 

 

반응형
LIST
Comments