Programmers

Programmers 문제 풀이 10

백단비 2023. 4. 2. 16:40

문제 설명 : 분수의 덧셈

첫 번째 분수의 분자와 분모 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가 반환된다는 것을

너무 늦게 깨달아 버린 거죠. 시간이 너무 잡아먹었어요ㅜㅜ

다들 그런 실수하시지 마시길.

 

https://programmers.co.kr/

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

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