문제 설명 : 분수의 덧셈
첫 번째 분수의 분자와 분모 numer1, denom1,
두 번째 분수의 분자와 분모 numer2, denom2
두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 담은 배열 return 하는 solution 함수?
제한 사항
0 < numer1, denom1, numer2, denom2 < 1,000
입출력 예
numer1 | denom1 | numer2 | denom2 | result |
1 | 2 | 3 | 4 | [5, 4] |
9 | 2 | 1 | 3 | [29, 6] |
function solution(numer1, denom1, numer2, denom2) {
//두 분수를 더한 후 분자와 분모를 구해줌
let numer = (numer1 * denom2) + (numer2 * denom1)
let denom = denom1 * denom2
let gcd = (a,b) => (a % b === 0) ? b : gcd(b, a % b)
// 유클리드 호제법(최대공약수구하기)을 삼항연산자를 이용하여 구현
return [numer / gcd(numer, denom), denom / gcd(numer, denom)]
//[분자 / 최대공약수, 분모 / 최대공약수]
}
유클리드 호제법
1. 두 수 중에서 큰 수를 작은 수로 나눔
2. 만약 나머지가 0일 경우 작은 수는 최대공약수
3. 나머지가 0이 아닐 경우 작은 수를 나머지로 나눔
4. 나머지가 0이 될때 까지 3을 반복
5. 나머지가 0이 되면 전 단계의 나머지가 최대 공약수임
ex) 244와 24가 있을때
244 % 24 = 4
24 % 4 = 0
따라서 244와 24의 최대공약수는 4가 됩니다
최대공약수 구하는 또다른 방법은 for문 돌리기입니다.
let getGCD = (a, b) => {
let gcd = 1; //gcd 초기화
for (let i = 2; i <= Math.min(a, b); i++) {
// 1은 0빼고 모두의 약수니까 건너띄고 a와 b 중 작은 수 까지 i를 구합니다.
// 마지막 i까지 돈 후 조건에 맞는 i중 젤 마지막에 조건에 맞는 i를 반환
if(a % i === 0 && b % i === 0) {
gcd = i;
}
}
return gcd;
}
처음에 바보 같은 짓을 계속했습니다.
a: 120 b: 20 일 때 i가 2일 때 만족하는데? 그럼 2가 나오는 거 아니야?라고 생가하면서 핀트가 계속 나갔죠
이거 아닌 거 같은데 왜 맞지 하면서.... for문에서 gcd에 계속 재할당을 해주면서 마지막 조건에 맞는 i가 반환된다는 것을
너무 늦게 깨달아 버린 거죠. 시간이 너무 잡아먹었어요ㅜㅜ
다들 그런 실수하시지 마시길.
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
320x100
'Programmers' 카테고리의 다른 글
Programmers 문제 풀이 12 (0) | 2023.04.04 |
---|---|
Programmers 문제 풀이 11 (0) | 2023.04.03 |
Programmers 문제 풀이 09 (0) | 2023.04.01 |
Programmers 문제 풀이 08 (0) | 2023.03.31 |
Programmers 문제 풀이 07 (0) | 2023.03.30 |