[백준/BOJ] 1735번 분수 합 (Node js / Javascript)

2023. 10. 10. 13:35코딩 테스트 (BOJ)

https://www.acmicpc.net/problem/1735

 

1735번: 분수 합

첫째 줄과 둘째 줄에, 각 분수의 분자와 분모를 뜻하는 두 개의 자연수가 순서대로 주어진다. 입력되는 네 자연수는 모두 30,000 이하이다.

www.acmicpc.net

문제 해석

각각 A / B로 이루어진 두 개의 분수가 "A  B" 와 같은 형식으로 두 줄에 나뉘어서 입력 받는다.

그리고 입력받은 두 분수의 합을 기약 분수로 나타내는 것이 문제이다.

 

즉, 두 분수의 합을 A3 / B3 이라 할 때, A3와 B3의 공약수가 없을때까지 같은 수로 나눠주면 된다.

 

1. 두 분수를 합하려면 분모를 같은 수로 통일시켜줘야 한다. 단순히 두 분모를 서로 곱해줘도 되지만 나는 지난 문제에서 배운 최대공배수를 복습하는 겸 사용하고 싶어서 최대공배수로 분모를 통일시켰다. - 최대공배수 = B3

ex) 1/6 + 1/15 => 5/30 + 2/30

 

let big = (deno1 > deno2) ? deno1 : deno2; // deno1 = 분모1, deno2 = 분모2
let small = (deno1 < deno2) ? deno1 : deno2;

let mod = big % small;

while(mod != 0){  //유클리드 호제법
    let tmp = mod;
    mod = small % mod;
    small = tmp;
}

let GCD = small; //GCD == 최대공약수
let LmsOfDeno = deno1 * deno2 / GCD; //LMS == 최소공배수

 

2. 분모가 통일 됐다면 분자끼리 더해주면 된다. 두 분자가 더해진 값(A3)이  분모(B3)와 공통된 1을 제외한 공통된 약수가 없다면 기약분수가 되겠지만, A3와 B3의 공약수가 존재하는 케이스도 처리해줘야 하기 때문에 이런 경우에 위에서 말했듯이 A3와 B3의 공약수가 없을때까지 같은 수로 나눠주면 된다.

let numer = numer1 + numer2;

let i = LmsOfDeno;

while(i > 0){
    if(numer == 1 || i == 1){
        break;
    }

    if((numer % i == 0)&&(LmsOfDeno % i == 0)){
        LmsOfDeno = LmsOfDeno / i;
        numer = numer / i;
    }else{
        i--;
    }
}

 

전체코드
const fs = require("fs");

const input = fs
  .readFileSync("../input.txt")
  .toString()
  .trim()
  .split("\n")
  .map((item) => item.split(" "));

const arr = input.map((item) => item.map((item) => Number(item)));

let numer1 = arr[0][0];
let deno1 = arr[0][1];

let numer2 = arr[1][0];
let deno2 = arr[1][1];

let big = (deno1 > deno2) ? deno1 : deno2;
let small = (deno1 < deno2) ? deno1 : deno2;

let mod = big % small;

while(mod != 0){
    let tmp = mod;
    mod = small % mod;
    small = tmp;
}

let GCD = small;
let LmsOfDeno = deno1 * deno2 / GCD;
numer1 = numer1 * (LmsOfDeno / deno1);
numer2 = numer2 * (LmsOfDeno / deno2);

let numer = numer1 + numer2;

let i = LmsOfDeno;

while(i > 0){
    if(numer == 1 || i == 1){
        break;
    }

    if((numer % i == 0)&&(LmsOfDeno % i == 0)){
        LmsOfDeno = LmsOfDeno / i;
        numer = numer / i;
    }else{
        i--;
    }
}

console.log(numer + " " + LmsOfDeno);

 

-끝-