Soluton 1) 내 풀이

class Solution {
    public int solution(int a, int b) {
        int newB = b / gcd(a, b);

        while (newB != 1) {
            if (newB % 2 == 0) {
                newB /= 2;
            } else if (newB % 5 == 0) {
                newB /= 5;
            } else {
                return 2;
            }
        }

        return 1;
    }

    private int gcd(int a, int b) {
        if (b == 0) {
            return a;
        } else {
            return gcd(b, a % b);
        }
    }
}

 

코드 및 문제 리뷰

int a와 int b가 주어진다. a를 분자로 b를 분모로 놓았을 때의 분수를 기약분수로 나타낸다. 
그 분수가 유한 소수가 된다면 1을, 무한소수라면 0을 반환하는 문제이다.
여기서 유한소수가 되는 조건은 분모가 갖는 소인수가 2와 5만 존재하는 경우이다.

GCD를 활용해 우선 기약분수로 만든다. 이후 분모가 1이 될 때 까지 유한소수의 조건인 2와 5로 나눈다. 
그렇게 1이 되어 반복문을 탈출하면 유한소수임이 증명 돼 1을, 2 또는 5로 나누었을 때 나누어 떨어지는 수가 아니라면 반복문 안에서 탈출 하지 못하고 조건문에 걸려 2를 반환하게 된다.

+ Recent posts