2 분 소요

Lv 0

문제 푸는건 5초 정리는 10분…

  • 문제 -> https://school.programmers.co.kr/learn/courses/30/lessons/120808

Java

// 내가 푼 답
class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
    // int 배열을 만듦 
        int numerator = (numer1 * denom2) + (numer2 * denom1); 
        int denominator = denom1 * denom2;

        for(int i = numerator-1; i > 1; i--) {
            // 기약분수로 만들기 
            if(numerator % i == 0 && denominator % i == 0) { 
                numerator /= i;
                denominator /= i;
            }
        }
        
        int[] answer = { numerator, denominator };
        return answer;
    }
}


// 다른 사람 풀이 

class Solution {
    public int GCD(int num1, int num2) {
        if (num1 % num2 == 0)
            return num2;
        return GCD(num2, num1 % num2);
    }

    public int[] solution(int denum1, int num1, int denum2, int num2) {
        int[] answer;

        denum1 *= num2;
        denum2 *= num1;

        answer = new int[]{denum1 + denum2, num1 * num2};

        int greatest_common_divisor = GCD(answer[0], answer[1]);
        answer[0] /= greatest_common_divisor;
        answer[1] /= greatest_common_divisor;

        return answer;
    }
}

정리

  1. 동시에 계속 나눠지는 값으로 업데이트 -> 더 이상 안 나눠질 때까지 반복문 진행
  2. 2번째 풀이는 해당 과정을 함수 사용해서 진행

Python

# 내가 푼 답
from fractions import Fraction

def solution(numer1, denom1, numer2, denom2):
    answer = []
    denom_3 = denom1 * denom2
    result_2 = numer1 * denom2
    result_3 = numer2 * denom1

    f_result = result_2 + result_3
    result = Fraction(f_result,denom_3)
    answer.append(result.numerator)
    answer.append(result.denominator)
    return answer

# 다른 사람이 푼 답
# 1 번째
import math
def solution(denum1, num1, denum2, num2):
    denum = denum1 * num2 + denum2 * num1
    num = num1 * num2
    gcd = math.gcd(denum, num)
    return [denum//gcd, num//gcd]

from fractions import Fraction

# 2 번째
def solution(denum1, num1, denum2, num2):
    answer = Fraction(denum1, num1) + Fraction(denum2, num2)
    return [answer.numerator, answer.denominator]

정리

  • 함수 없이도 구현 가능한 것 같지만 편의를 위해 pass
  • 라이브러리 fraction 또는 math를 사용
    • fraction 에서 numerator는 분자, denominator는 분모다.
    • math 라이브러리에서 gcd는 최대공약수 lcm은 최소공배수다.
  • 리턴에 리스트 바로 구현 가능한거 처음 앎;;

JavaScript

// 내가 푼 답
function solution(numer1, denom1, numer2, denom2) {
    var numerator = (numer1 * denom2) + (numer2 * denom1); 
    var denominator = denom1 * denom2;
    var answer = [];
    for(i = numerator-1; i>1; i--){
        if(numerator % i == 0 && denominator % i == 0) { 
            numerator /= i;
            denominator /= i;
            }
    }
    answer.push(numerator)
    answer.push(denominator)

    return answer;
}
// 다른 사람 풀이
  
function fnGCD(a, b){
    return (a%b)? fnGCD(b, a%b) : b;
}

function solution(denum1, num1, denum2, num2) {
    let denum = denum1*num2 + denum2*num1;
    let num = num1 * num2;
    let gcd = fnGCD(denum, num); //최대공약수

    return [denum/gcd, num/gcd];
}

정리

  • 자바랑 자바스크립트는 유사한 점이 참 많은거 같다.
  • 논리는 자바랑 동일하게 구현했다.

출처 : 프로그래머스, https://wikidocs.net/21113

댓글남기기