다오의 개발일지

프로그래머스 LV0 분수의 덧셈 문제 본문

코딩테스트

프로그래머스 LV0 분수의 덧셈 문제

다오__ 2023. 5. 23. 22:45

https://school.programmers.co.kr/learn/courses/30/lessons/120808

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

 

 

 

슥슥 풀다가 갑자기 어려운 문제가 등장.. 수학을 못하는 나에겐 이런 문제도 난이도가 높다.

처음에 생각했던 건 최대 공약수는 나머지가 존재하지 않지 않는가였다.

그에 따른 로직을 아래처럼 짜보았다.

class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {


        int result2, result1;
        //최대공약수존재
        if(denom2 % denom1 == 0){
            //moc은 최대공약수 값
            int moc = denom2 / denom1;
                //최대공약수로 나누기
             result2 = (denom1 * denom2) / moc;
             result1 = ((numer1 * denom2)+(numer2 * denom1)) / moc;

        }else{
            //최대공약수 존재X
            result2 = denom1*denom2;
            result1 = (numer1 * denom2)+(numer2 * denom1);
        }

        int[] answer = {result1, result2};

        return answer;

    }
}

두개의 예시 테스트를 통과하고 풀었구나... 생각했지만 최종테스트결과는 실패였다.

생각해보니 4와 6의 처럼 나머지가 존재하는 경우에도 최대공약수를 가질 수 있었다.

검색을 해보며 유클리드 호제법에 대해 알게되었다.

이를 토대로 다시 코드를 짜보았지만 성공률은 33.3퍼에서 멈추었다.

 

원인은 getGCD의 인수(argment)에 있었다.. 분자 분모 num1과 num2를 먼저 구한 후 인수에 넣어야 했지만 인수를denom1,denom2를 넣어버린 실수를 저질렀다.

 

수정한 코드를 통해 통과를 할 수 있었다.

       public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        int[] answer = new int[2];

        //분자
        int num1=numer1*denom2+numer2*denom1;
        //분모
        int num2=denom1*denom2;

        int gcd= getGcd(num1, num2); //최대공약수를 구해준다.


        answer[0] = num1/gcd;
        answer[1] = num2/gcd;
        return answer;
    }
    public static int getGcd(int a, int b) {
        if(a%b==0) {
            return b;
        }
        return getGcd(b, a%b);
    }