프로그래머스 유한소수 판별하기

KIMYEONGJUN·2026년 9월 22일
post-thumbnail

문제

내가 생각했을때 문제에서 원하는부분

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

내가 이 문제를 보고 생각해본 부분

최대공약수 구하기 및 약분
getGcd(a, b) 메서드를 호출하여 분자 a와 분모 b의 최대공약수를 구한다.
분모 b를 최대공약수로 나누어 기약분수의 분모 형태로 만든다.
분모에서 2와 5 제거하기
첫 번째 while 반복문은 분모 b가 2로 나누어떨어지는 동안 계속 2로 나눈다.
두 번째 while 반복문은 분모 b가 5로 나누어떨어지는 동안 계속 5로 나눈다.
최종 결과 판별하기
2와 5를 모두 나눈 뒤 남은 분모 b의 값이 1인지 확인한다.
분모가 1이라면 유한소수이므로 1을 반환하고, 1이 아니라면 무한소수이므로 2를 반환한다.
getGcd 메서드는 유클리드 호제법 알고리즘을 사용하여 두 수의 최대공약수를 재귀적으로 구한다.

코드로 구현

class Solution {
    public int solution(int a, int b) {
        int gcd = getGcd(a, b);
        b = b / gcd;
        
        while (b % 2 == 0) {
            b /= 2;
        }
        
        while (b % 5 == 0) {
            b /= 5;
        }
        
        if (b == 1) {
            return 1;
        } else {
            return 2;
        }
    }
    
    private int getGcd(int x, int y) {
        if (y == 0) {
            return x;
        }
        return getGcd(y, x % y);
    }
}

프로그래머스 코드

package programmers.programmers2;

// 프로그래머스 유한소수 판별하기
public class Main151 {
    public static void main(String[] args) {
        Solution6 sol = new Solution6();
        System.out.println(sol.solution(7, 20)); // 1
        System.out.println(sol.solution(11, 22)); // 1
        System.out.println(sol.solution(12, 21)); // 2
    }
}

class Solution6 {
    public int solution(int a, int b) {
        int gcd = getGcd(a, b);
        b = b / gcd;

        while (b % 2 == 0) {
            b /= 2;
        }

        while (b % 5 == 0) {
            b /= 5;
        }

        if (b == 1) {
            return 1;
        } else {
            return 2;
        }
    }

    private int getGcd(int x, int y) {
        if (y == 0) {
            return x;
        }
        return getGcd(y, x % y);
    }
}

위에 있는 코드를 변경한 코드

마무리

코드와 설명이 부족할수 있습니다. 코드를 보시고 문제가 있거나 코드 개선이 필요한 부분이 있다면 댓글로 말해주시면 감사한 마음으로 참고해 코드를 수정 하겠습니다.

profile
Junior backend developer

0개의 댓글