티스토리 뷰
# 분수의 덧셈
문제 설명
첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
제한사항
0 <numer1, denom1, numer2, denom2 < 1,000
입출력 예 설명
입출력 예 #1
1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.
입출력 예 #2
9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6]을 return 합니다.
처음 작성했던 답안
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int[] answer = new int[2];
int numer3 = numer1*denom2 + numer2*denom1;
int denom3 = denom1*denom2;
answer[0] = numer3;
answer[1] = denom3;
return answer;
}
}
위와 같이 작성할 경우
최대 공약수가 없을 경우 정답으로 인정될수있다.
하지만 문제에서 기약분수라고 했기 때문에 분모와 분자의 공약수가 1로 더 이상 나누어지면 안된다.
그렇기 때문에 위의 코드에 최대 공약수를 구하는 코드를 추가적으로 작성해주어야한다.
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int[] answer = new int[2];
int numer3 = numer1*denom2 + numer2*denom1;
int denom3 = denom1*denom2;
int max=0;
for(int i=1; i<=numer3 && i<=denom3; i++){
if(numer3%i==0 && denom3%i==0){
max=i;
}
}
answer[0] = numer3/max;
answer[1] = denom3/max;
return answer;
}
}
이 문제는 유클리드 호제법을 이용하여 최대 공약수를 구해 효율적인 코드를 작성하도록 유도되는 문제이다.
유클리드 호제법(Euclidean algorithm)은 두 수의 최대 공약수(GCD)를 효율적으로 구하는 방법이다.
이 방법을 사용하면 반복적인 나눗셈을 통해 빠르게 GCD를 계산할 수 있다.
이 방법을 사용해 답변을 아래 코드와 같이 수정해보았다.
class Solution {
// 유클리드 호제법을 이용하여 최대 공약수를 구하는 함수
private int gcd(int a, int b) {
while (b != 0) {
int temp = b;
b = a % b;
a = temp;
}
return a;
}
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int[] answer = new int[2];
// 두 분수의 합을 계산
int numer3 = numer1 * denom2 + numer2 * denom1; // 새로운 분자
int denom3 = denom1 * denom2; // 새로운 분모
// 최대 공약수를 구해서 분자와 분모를 기약분수로 변환
int gcd = gcd(numer3, denom3);
answer[0] = numer3 / gcd;
answer[1] = denom3 / gcd;
return answer;
}
}
- gcd 메서드: 유클리드 호제법을 사용하여 두 수의 최대 공약수를 계산한다.
- solution 메서드:
- 두 분수의 합을 계산하여 새로운 분자(numer3)와 분모(denom3)를 구한다.
- gcd 메서드를 사용하여 numer3과 denom3의 최대 공약수를 구한다.
- 분자와 분모를 최대 공약수로 나누어 기약분수로 변환한다.
'코딩 > 오류 노트' 카테고리의 다른 글
이클립스 설정파일 수정 (0) | 2024.07.12 |
---|---|
마지막 두 원소 오류 주의할 점 (0) | 2024.05.22 |
[23주 5일차] split 사용! 근데 문제 생김! 공백이 첫번째 값으로 취급되어 버리네...? (0) | 2024.03.15 |
[23주 5일차] postmapping db 저장안됨 (1) | 2024.03.15 |
[AJAX] 라디오버튼 값에 따른 출력값 변경 (0) | 2024.03.05 |
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday