본문 바로가기

알고리즘

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

728x90

최대 공약수랑 최소 공배수를 바로 생각했었어야 했는데 진짜 무식하게 풀었다.

두 분수를 더한 값을 분자는 0, 분모는 1 인덱스에 넣어주는 문제다.

 

JavaScript

- 최소 공배수로 깔끔하게 했으면 됐는데, 그냥 머리속에 계산 하듯이 조건 나눴다.

- 정답이 안 나오길래 보니 마지막에 약분을 해야한다.

function solution(numer1, denom1, numer2, denom2) {
    let answer = null;
    if (denom1 % denom2 == 0 || denom2 % denom1 == 0) {
        if (denom1 >= denom2) {
            const div = denom1 / denom2;
            
            answer = [numer1 + numer2 * div, 
                    denom1];
        } else {
            const div = denom2 / denom1;
            
            answer = [numer1 * div + numer2,
                    denom2];
        }
    } else {
        answer = [numer1 * denom2 + numer2 * denom1, 
                denom1 * denom2];
    }
    
    const num = findMaxDivde(answer[0], answer[1]);

    return answer.map((el) => el / num);
}

// 두수의 최대 공약수
function findMaxDivde(a, b) {
    if (a === b) {
        return a;
    }
    
    const bigger = a > b ? a : b;
    let answer = 1;
    
    for(let i = 1; i < bigger; i++) {
        if (a % i === 0 && b % i === 0) {
            answer = i;
        }
    }
    
    return answer;
}

 

JAVA

- GCD와 LCS를 구하는 모듈을 짜고 구하는 모습이다.

- 마지막에 정답 잘 구해도 또 약분해야 한다.

class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        int gcd = findGcd(denom1, denom2);
        int lcs = findLcs(denom1, denom2);

        int up = (numer1 * denom2 + numer2 * denom1) / gcd;
        int down = lcs;

        int finalGcd = findGcd(up, down);

        return new int[]{up / finalGcd, down / finalGcd};
    }

    public int findGcd(int a, int b) {
        if (a == b) {
            return a;
        }

        int answer = 1;
        int bigger = a > b ? a : b;

        for (int i = 1; i < bigger; i++) {
            if (a % i == 0 && b % i == 0) {
                answer = i;
            }
        }

        return answer;
    }

    public int findLcs(int a, int b) {
        return a * b / findGcd(a, b);
    }
}
300x250