👾 유한소수 판별하기

유한소수 판별하기 문제 링크

📑 문제

소수점 아래 숫자가 계속되지 않고 유한개인 소수를 유한소수라고 합니다. 분수를 소수로 고칠 때 유한소수로 나타낼 수 있는 분수인지 판별하려고 합니다. 유한소수가 되기 위한 분수의 조건은 다음과 같습니다.

  • 기약분수로 나타내었을 때, 분모의 소인수가 2와 5만 존재해야 합니다.

두 정수 ab가 매개변수로 주어질 때, a/b가 유한소수이면 1을, 무한소수라면 2를 return하도록 solution 함수를 완성해주세요.

⛔ 제한사항

  • a, b는 정수
  • 0 < a ≤ 1,000
  • 0 < b ≤ 1,000

❓고려했던 점

처음 풀이를 했을 때에는
1. a,b의 최대공약수를 구해서 분모를 최대공약수로 나눈 후
2. 분모인 b를 2와 5로 나눈 후
3. 두 경우에서 나머지가 0이라면 유한소수라고 판단해서 1을 리턴
...하도록 코드를 작성했다.

그랬더니 약 10개 가량의 테스트 케이스에서 실패가 떴다...🥲
당연함! 분모에 2,5 이외에 다른 소수가 있다면 무한소수가 되기 때문에 그런 것이었다.
그러면 소인수분해를 진행해야 하는데 이미 내 코드는 너무 길고...🥲 그러기 싫어서 while문을 사용해서 2,5 외의 다른 소수가 있는지 보기로 했다. (참고 링크)

💡내 풀이

function solution(a, b) {
    // 1. 최대공약수 g를 구한다.
    let g = 1;
    for (let i = 1; i<= b; i++){
        if(a%i ===0 && b%i ===0) g = i;
    }
    
    // 2. 분모 b를 최대공약수 g로 나눈다.
    b = b/g    

    // 3. b를 2와 5로 나눈 나머지 값이 0이 될 때까지 반복문을 실행한다.
    // (= 2와 5를 제외한 소수가 있는지 확인)
    while (b%2 === 0) b = b/2
    while (b%5 === 0) b = b/5

    // 4. b가 1이라면 유한소수이므로(분모의 소인수가 2와 5만 존재) 1을 리턴,
    // b가 그 외의 값이라면 무한소수이므로(분모에 2와 5를 제외한 소수가 포함) 2를 리턴한다.
    return b === 1? 1 : 2;
}

💡다른 사람의 풀이

가장 상단에 있던 toFixed() 메소드를 사용한 풀이.
toFixed()는 숫자를 고정 소수점 표기법으로 표시하는 메소드이다.
()안에 있는 숫자를 이용해서 소수점 아래 n자리까지를 표기한다.

function solution(a, b) {
  	// a를 b로 나눈 수를 소수점 아래 10의 자리만큼 표기한 후 Number 타입으로 변환한다.
  	// 이때 변환한 값과 a를 b로 나눈 수가 같다면 유한소수이므로 1,
  	// 아니라면 무한소수이므로 2를 리턴한다.
    return Number((a/b).toFixed(10)) == a/b ? 1 : 2
}

이건 다른 풀이인데 간단해보여서 가져왔다!
a를 b로 나눈 값의 소수점 아래 자리가 10이 넘어간다면 무한소수일 확률이 높기 때문에 이런 방식으로도 통과가 가능한 것 같다.

function solution(a, b) {
    return (a/b).toString().length > 10 ? 2 : 1
}

참고 링크

MDN Web docs - Number.prototype.toFixed()

profile
잘하는 건 아닌데 포기하진 않을거야

1개의 댓글

도움이 되었습니다 :) 감사합니다 !

답글 달기