코테/프로그래머스

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

imname1am 2023. 2. 13. 13:46
반응형

내 코드 (틀림)

import java.util.*;

class Solution {
    public int solution(int a, int b) {
        int answer = 0;

        for(int i = 2 ; i <  Math.min(a,b) ; i++) {
            // 기약분수로 만들기
            if((a % i == 0) && (b % i == 0)) {
                a /= i;
                b /= i;
            }
        }
        
        
        // 분모의 소인수가 2와 5만 존재하는 경우
        if(b % 2 == 0 || b % 5 == 0 || b % 10 == 0) {
            answer = 1;
        } else {
            answer = 2;
        }
        return answer;
    }
}

처음에 작성한 코드는 이거..

기약분수로 나타내었을 때 분모의 소인수가 2와 5만 존재해야 한다고 해서 이렇게 작성했었다..

 

TC 수 역대급...

무슨 조건을 더 해줘야할까... 생각하다가

그냥 기약분수 구하는 유클리드 호제법을 쓰던 분수의 덧셈 문제가 생각나서

참고하면서 아예 새로 코드 작성하기로 했다.

 

프로그래머스 [JAVA] :: 분수의 덧셈

📚 문제 정의 첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다.

velog.io

 

그리고 다른 분 답도 참고했다..

 

프로그래머스 코딩테스트 입문 유한소수 판별하기 [JAVA] - 22년 10월 12일

 

velog.io

정답

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);
    }
}

다른 분 답을 참고하고 보니

내 초기 코드에서 무슨 문제가 있었는지 알았다.

 

'분모가 2와 5와 10으로 나눠지는 경우라면 분모의 소인수가 2와 5로만 구성된 분모일 것이다' 라고 생각했는데

그게 아니었다.

 

먼저 분자와 분모의 최대공약수를 구해놓고,

이 값이 2/5로 나눠지면 분모를 2/5로 나누고 반복문을 자꾸 돌게 해야 했던 것..

 

아무튼.... 그다지 어렵지 않아보여서 금방 풀거라 생각했는데 풀다 보니 생각보다 시간이 또 금방 지나있다.ㅠㅠ

반응형