초보 개발자의 성장 일기

유한소수 판별하기 본문

Development/Algorithm

유한소수 판별하기

YUNA 2023. 11. 21. 22:37

문제 설명

소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.
기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.
두 정수 a와 b가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.

 

나의 문제 해결 방법

분모와 분자를 기약분수로 만들고 유한소수의 조건을 만들기 위해서는 분모를 2나 5로 나눠서 몫이 1이 되면 유한소수로 판별 하면 된다고 생각했다.

function solution(a, b) {
    let topNum = a;
    let bottomNum = b;
    for(let i = topNum; i>0; i--) {
        if(topNum%i===0 && bottomNum%i===0) {
            topNum = topNum/i
             bottomNum = bottomNum/i
        }
    }
    if(bottomNum%2===0) {
        bottomNum = bottomNum/2
    }
    if(bottomNum%5 ===0 ) {
        bottomNum = bottomNum/5
    }
    return bottomNum == 1 ? 1 : 2
}

이렇게 했더니 정답이 아니라고 뜨는데 이유는 유한 소수를 판별할 때 if를 써서 한번만 나눴기 때문이다.

 

function solution(a, b) {
    let topNum = a;
    let bottomNum = b;
    for(let i = topNum; i>0; i--) {
        if(topNum%i===0 && bottomNum%i===0) {
            topNum = topNum/i
             bottomNum = bottomNum/i
        }
    }
    while (bottomNum % 2 === 0) {
        bottomNum = bottomNum / 2;
    }
    while (bottomNum % 5 === 0) {
        bottomNum = bottomNum / 5;
    }
    return bottomNum == 1 ? 1 : 2
}

while을 사용해 줌으로써 조건을 만족하는 한 계속 실행이 된다.

 

다른 해결 방법

function solution(a, b) {
    return Number((a/b).toFixed(10)) == a/b ? 1 : 2
}

분수를 계산하고 toFixed(10)은 소수점 이하 10자리까지를 포함하는 문자열로 변환한다. 이후 다시 숫자로 변환하고 변환한 값이 원래의 a/b와 일치하는지 확인하여, 일치하면 1을 반환하고, 그렇지 않으면 2를 반환한다.

 

toFixed()

Number 객체의 메서드로 인수로 전달된 소수 자릿수로 반올림된 값을 문자열로 반환한다. 소수점 뒤에 나타날 자릿수는 0이상 100이하의 값을 사용하며 값을 넣지 않으면 0이 기본으로 사용된다.

 

파라 미터가 0과 100 사이의 값이 아니라면 Uncaught RangeError: toFixed() digits argument must be between 0 and 100라는 오류가 발생된다.

numObject.toFixed([소수 부분의 자리수]);