[알고리즘문제풀기] 분수의 덧셈

silver's avatar
Feb 09, 2025
[알고리즘문제풀기] 분수의 덧셈

문제

내가 작성한 정답

class Solution { public int[] solution(int numer1, int denom1, int numer2, int denom2) { int[] answer = new int[2]; if(denom1==denom2){ answer[0] = numer1+numer2; answer[1] = denom1; int gcd = getGcd(answer[0],answer[1]); answer[0] = answer[0]/gcd; answer[1] = answer[1]/gcd; }else{ answer[1] = denom1*denom2; answer[0] = numer1*denom2+numer2*denom1; int gcd = getGcd(answer[0],answer[1]); answer[0] = answer[0]/gcd; answer[1] = answer[1]/gcd; } return answer; } private int getGcd(int a, int b){ while (b !=0){ int c = a % b; a = b; b= c; } return a; } }
→ 어짜피 최소 공배수로 나눌 거라 if로 분모가 같은 경우를 나눌 필요가 없다
class Solution { public int[] solution(int numer1, int denom1, int numer2, int denom2) { int[] answer = new int[2]; answer[1] = denom1*denom2; answer[0] = numer1*denom2+numer2*denom1; int gcd = getGcd(answer[0],answer[1]); answer[0] = answer[0]/gcd; answer[1] = answer[1]/gcd; return answer; } private int getGcd(int a, int b){ while (b !=0){ int c = a % b; a = b; b= c; } return a; } }

최소공배수를 구하는 유클리드 호제법 - “유한소수 구하기” 문제에서 사용

private int getGcd(int a, int b){ while (b !=0){ int c = a % b; a = b; b= c; } return a; }
💡

유클리드 호제법

public class EuclideanAlgorithm { // 최대공약수 계산 메서드 public static int gcd(int a, int b) { while (b != 0) { // b가 0이 아닐 때까지 반복 int temp = b; // b의 값을 temp에 저장 b = a % b; // a를 b로 나눈 나머지를 b에 저장 a = temp; // temp의 값을 a에 저장 } return a; // a가 최대공약수 } // 최소공배수 계산 메서드 public static int lcm(int a, int b) { return Math.abs(a * b) / gcd(a, b); // LCM 계산 } }
// 최대공약수 계산 메서드 public static int gcd(int a, int b) { return b == 0 ? a : gcd(b, a % b); // 삼항 연산자를 사용한 재귀적 호출 } // 최소공배수 계산 메서드 public static int lcm(int a, int b) { return (a != 0 && b != 0) ? Math.abs(a * b) / gcd(a, b) : 0; // 삼항 연산자를 사용하여 0 체크 }
 

다른 사람들의 정답

class Solution { public int[] solution(int denum1, int num1, int denum2, int num2) { int mother = num1 * num2; int son1 = num1 * denum2; int son2 = num2 * denum1; int totalSon = son1 + son2; for(int i = mother; i >= 1; i--){ if(totalSon % i == 0 && mother % i == 0){ totalSon /= i; mother /= i; } } int[] answer = {totalSon, mother}; return answer; } }
class Solution { public int[] solution(int denum1, int num1, int denum2, int num2) { int denum = denum1 * num2 + denum2 * num1; int num = num1 * num2; int gcd = getGCD(denum, num); return new int[]{denum / gcd, num / gcd}; } public int getGCD(int a, int b) { if (a % b == 0) { // 만약 a가 b로 나누어 떨어지면 return b; // b가 최대공약수(GCD) } return getGCD(b, a % b); // 재귀 호출 } }
Share article

silver