[백준] 1735 분수 합 JavaScript

·2024년 5월 24일

문제

분수 A/B는 분자가 A, 분모가 B인 분수를 의미한다. A와 B는 모두 자연수라고 하자.

두 분수의 합 또한 분수로 표현할 수 있다. 두 분수가 주어졌을 때, 그 합을 기약분수의 형태로 구하는 프로그램을 작성하시오. 기약분수란 더 이상 약분되지 않는 분수를 의미한다.

입력

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

출력

첫째 줄에 구하고자 하는 기약분수의 분자와 분모를 뜻하는 두 개의 자연수를 빈 칸을 사이에 두고 순서대로 출력한다.

예제 입력

2 7
3 5

예제 출력

31 35

내가 했던 풀이 방법

  1. 입력받은 수를 공백을 기준으로 분할한 뒤, Number형으로 변환해준다.
  2. 입력받은 수 중 분모에 해당하는 수를 LCM에 인자로 전달해준다.
  3. LCM에서는 1부터 반복하여, num1×i를 num2로 나눈 결과가 0일 경우 (num1×i는 최소공배수가 됨) num1×i를 return해준다.
  4. LCM의 결과를 이용해 모든 분자를 LCM의 반환값에 해당 분모를 나눠준 값을 곱해주고, 모든 분모를 LCM의 결과로 바꿔준다. (일반적인 통분 과정과 같음)
  5. GCD에 분자의 합과 분모 하나를 인자로 전달해준다.
  6. 두 수 중 작은 수를 min에 저장해주고, 2부터 min까지 num1%i와 num2%i가 모두 0일 경우, i로 두 수를 나눠주고 i를 1감소시켜준다. (1을 감소시켜주는 이유는 예를 들어 12와 같은 경우는 2×2×3으로 이루어져있기 때문에 1을 감소시켜주지 않으면 2로 한 번밖에 나눠줄 수 없기 때문이다.) num1과 num2 모두 값이 달라졌으므로 min값도 바뀐 값 중 작은 값으로 바꿔준다.
  7. 6번의 결과로 바뀐 num1과 num2를 반환해준 뒤, 형식에 맞춰 출력해준다.

코드

const fs = require('fs');
let input = fs.readFileSync(0, 'utf-8').toString().trim().split('\n');

let A = 0;
let B = 0;
for (let i = 0; i < 2; i++) {
  input[i] = input[i].trim().split(' ').map(Number);
}

function LCM(num1, num2) {
  for (let i = 1; ; i++) {
    if ((num1 * i) % num2 === 0) return num1 * i;
  }
}

let mul = LCM(input[0][1], input[1][1]);
input[0][0] *= mul / input[0][1];
input[0][1] = mul;
input[1][0] *= mul / input[1][1];
input[1][1] = mul;

function GCD(num1, num2) {
  let min = Math.min(num1, num2);

  for (let i = 2; i <= min; i++) {
    if (num1 % i === 0 && num2 % i === 0) {
      num1 /= i;
      num2 /= i;
      i--;
      min = Math.min(num1, num2);
    }
  }

  return [num1, num2];
}

console.log(GCD(input[0][0] + input[1][0], input[0][1]).join(' '));

회고

최소공배수랑 최대공배수만 구현할 수 있다면 대부분 분수를 더하는 과정은 알고있기에 쉽게 풀 수 있는 문제 실버3치고는 쉬운 문제였던 것 같다.

profile
Frontend🍓

0개의 댓글