프로그래머스 분수의 덧셈 (알고리즘)
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;
}
}
정리
- 동시에 계속 나눠지는 값으로 업데이트 -> 더 이상 안 나눠질 때까지 반복문 진행
- 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
댓글남기기