[BaekJoon] 1735 분수 합

오태호·2022년 3월 11일
0

1.  문제 링크

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

2.  문제

요약

  • 주어진 두 분수의 합을 기약분수로 구한 후, 분자와 분모를 출력하는 문제입니다.
  • 입력: 첫 번째 줄과 두 번째 줄에는 분자 분모가 각각 주어집니다.
  • 출력: 두 분수의 합을 기약분수로 구한 후, 분자와 분모를 출력합니다.

3.  소스코드

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.StringTokenizer;

public class Main {
	public int gcd(int numerator, int denominator) {
		int min, max;
		int num;
		if(numerator > denominator) {
			min = denominator;
			max = numerator;
		} else {
			min = numerator;
			max = denominator;
		}
		while(min != 0) {
			num = max % min;
			max = min;
			min = num;
		}
		return max;
	}
	
	public int[] getSimpleFraction(String input1, String input2) {
		int[] result = new int[2];
		StringTokenizer st = new StringTokenizer(input1);
		int numerator1 = Integer.parseInt(st.nextToken());
		int denominator1 = Integer.parseInt(st.nextToken());
		st = new StringTokenizer(input2);
		int numerator2 = Integer.parseInt(st.nextToken());
		int denominator2 = Integer.parseInt(st.nextToken());
		int numerator = numerator1 * denominator2 + numerator2 * denominator1;
		int denominator = denominator1 * denominator2;
		int gcd = gcd(numerator, denominator);
		result[0] = numerator / gcd;
		result[1] = denominator / gcd;
		return result;
	}
	
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		String input1 = br.readLine();
		String input2 = br.readLine();
		br.close();
		Main m = new Main();
		int[] result = m.getSimpleFraction(input1, input2);
		for(int i = 0; i < 2; i++) {
			bw.write(result[i] + " ");
		}
		bw.flush();
		bw.close();
	}
}

4.  접근

  • 분모를 같은 수로 맞춰줘야 하는데, 최소공배수를 찾아서 분모를 맞추는 대신, 최소공배수를 찾는 시간을 줄이기 위해 두 분모를 곱하여 분모를 맞춰줍니다.
  • 분자는 각자 서로의 분모를 곱하여 더해 분자를 구합니다.
  • 기약분수는 분모와 분자의 최대 공약수가 1이어야 하기 때문에 구한 분자와 분모에 대해 최대 공약수를 찾아 분자와 분모에 각각 최대 공약수로 나눠줍니다.
  • 최대 공약수는 유클리드 알고리즘을 이용하여 구합니다.
    • 임의의 두 자연수 a, b가 주어졌을 때, 둘 중 큰 값이 a라고 한다면 a % b를 한 값을 n이라고 가정합니다.
    • n이 0일 때, b가 최대 공약수가 됩니다.
    • 만약 n이 0이 아니라면 a에 b의 값을 넣어주고, b에 n을 넣어준 후 다시 a % b를 하여 이 값을 n으로 하고 위 과정을 반복합니다.
  • 이렇게 구한 기약분수의 분자와 분모를 출력합니다.
profile
자바, 웹 개발을 열심히 공부하고 있습니다!

0개의 댓글

관련 채용 정보