문제
내가 작성한 정답
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