코딩 테스트

[프로그래머스 Level 0] 유한소수 판별하기

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

 

문제 풀어보기: https://school.programmers.co.kr/learn/courses/30/lessons/120878

 

풀이보기
더보기
function solution(a, b) {
    let min = Math.min(a, b);
    let numerator = a;
    let denominator = b;
    
    for(let i = 2; i <= min; i++) {
        if(numerator % i === 0 && denominator % i === 0) {
            numerator = Math.floor(numerator / i);
            denominator = Math.floor(denominator / i);
        }
    }
    
    while(denominator !== 1) {
        if(denominator % 2 === 0) {
            denominator = Math.floor(denominator / 2);
        } else if(denominator % 5 === 0) {
            denominator = Math.floor(denominator / 5);
        } else {
            return 2;
        }
    }
    
    return 1;
}

먼저 기약분수로 변환하기 위해 두 수 중 더 작은 수를 찾아 min 변수에 넣어주고,

for문에서는 2부터 min까지의 수를 통해 각각 나눠지는 숫자일 때 분자와 분모를 나눠준다.

 

그 다음 기약분수는 만들어졌으니 while문을 통해 분모의 소인수가 2, 5뿐인지 판별해준다.

조건은 분모가 1이되면 멈추도록 해주고 분모를 각각 2와 5로 나누었을 때 나머지가 0이 되는 경우에만

분모와 2 또는 5로 나눈 몫을 분모에 저장해준다.

 

여기서 2와 5로 나누어지지 않는다면 무한 소수이므로 2를 리턴해주고,

정상적으로 while문이 종료되면 유한소수일테니 1을 리턴해준다.