[코딩테스트] 유한소수 판별하기

windowook·2023년 12월 26일
post-thumbnail

🌱 유한소수 판별하기

문제

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

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

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

⛔ 제한사항

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

나의 풀이

function solution(a, b) {
    let g = 1;
    for (let i = 0; i <= b; i++) {
        if (a % i === 0 && b % i === 0) g = i;
    }
    
    b = b / g;
    
    while (b % 2 === 0) b = b / 2;
    while (b % 5 === 0) b = b / 5;
    
    return b === 1 ? 1 : 2;
}

로직 설명
최대공약수를 1로 설정해두고 분모인 b이하까지 i를 돌면서 a와 b를 나눈 나머지가 모두 0일때
그 i가 최대공약수를 갱신하도록 했습니다.

다음 최대공약수로 분모를 나누고 2와 5로 나눈 나머지가 0인 동안은 계속 2와 5로 나누는 과정을
거치게 했습니다. 그렇게 해서 구해진 b가 1이라면 a/b는 유한소수이고 아니라면 무한소수입니다.

다른 사람의 풀이 Best

function solution(a, b) {
    let n = 1;
    for (let i = 1; i <= Math.min(a,b); i++) {
        if (a%i===0 && b%i===0) n = i;
    }

    b/=n;
    while (b%2===0) b/=2;
    while (b%5===0) b/=5;

    return b === 1 ? 1 : 2;   
}

for 문의 범위가 차이인데, 최대공약수가 분자보다 더 크지 않도록 제한을 걸어줬네요.

profile
안녕하세요

0개의 댓글