[Programmers] 코딩테스트
[Day 2] 분수의 덧셈
문무스
2022. 11. 18. 02:24
📒문제 설명
첫 번째 분수의 분자와 분모를 뜻하는 denum1, num1, 두 번째 분수의 분자와 분모를 뜻하는 denum2, num2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
🚫제한사항
• 0 <denum1, num1, denum2, num2 < 1,000
📄입출력 예
denum1 | num1 | denum2 | num2 | result |
1 | 2 | 3 | 4 | [5, 4] |
9 | 2 | 1 | 3 | [29, 6] |
📑입출력 예 설명
입출력 예 #1
- 1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.
입출력 예 #2
- 9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6]을 return 합니다.
✍️ 풀이
🤔생각해 본 내용
1. 분모 값 = num1 * num2
2. 분자 값 = denum1 * num2 + denum2 * num1
3. 1과 2의 최대공약수로 분자, 분모 나누기
3-1. 분모 값과 분자 값 중 작은 수로 분자, 분모 나눠보기
3-1-1. 나눠지면, 그 수가 최대공약수
3-1-2. 안 나눠지면, 작은 수를 1 줄이고 3-1 다시 실행.
1) if로 분모와 분자 중 작은 값을 찾아서 분모, 분자를 나눠보고, 안나눠지면 1을 빼고 while을 이용해서 다시 반복
function solution(denum1, num1, denum2, num2) {
let answer = [];
// 1. 분모 값 = num1 * num2
// 2. 분자 값 = denum1 * num2 + denum2 * num1
// 3. 1과 2의 최대공약수로 분자, 분모 나누기
// 3-1. 분모 값과 분자 값 중 작은 수로 분자, 분모 나눠보기
// 3-1-1. 나눠지면, 그 수가 최대공약수
// 3-1-2. 안 나눠지면, 작은 수를 1 줄이고 3-1 다시 실행.
let x = num1 * num2; // 분모 값
let y = denum1 * num2 + denum2 * num1; // 분자 값
let minNum = 0; // 최대공약수를 담을 minNum 초기화
if(x < y){
minNum = x;
} else {
minNum = y;
}
while(0 < minNum){
if(x % minNum === 0 && y % minNum === 0){
return answer = [y / minNum, x / minNum];
}
minNum = minNum - 1;
}
}
2) 유클리드 호제법 사용
function solution(denum1, num1, denum2, num2) {
let answer = [];
// 1. 분모 값 = num1 * num2
// 2. 분자 값 = denum1 * num2 + denum2 * num1
// 3. 1과 2의 최대공약수로 분자, 분모 나누기
// 3-1. 분모 값과 분자 값 중 작은 수로 분자, 분모 나눠보기
let x = num1 * num2; // 분모 값
let y = denum1 * num2 + denum2 * num1; // 분자 값
let minNum = 0; // 최대공약수를 담을 minNum 초기화
let gcd = (a, b) => (a % b === 0 ? b : gcd(b, a % b)); // a를 b로 나눈 나머지가 0이면, b가 최대공약수, 0이 아니면, 다시 b를 a % b로 나누기를 반복해서 최대공약수 구하기
minNum = gcd(y, x); // 최대공약수를 minNum에 담기
answer = [y / minNum, x / minNum]; // answer에 분자와 분모를 최대공약수로 나눈 값들을 담기
return answer;
}
출처: