⌨️ 프로그래머스/코딩테스트 입문

[코딩 테스트] 분수의 덧셈 | JS

하나둘세현 2024. 1. 24. 20:47
728x90

문제

첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

해결 과정

 

1. 분모의 덧셈을 하기 위해 

const numer와 const denom의 분자, 분모의 변수를 만들어줬다.

 

2. 분자 분모의 최대공약수로 나누는 것이다. 

최대 공약수는 어떻게 만들까?

i) 분자 분모 중 작은 수를 찾아야 한다.

작은 수를 찾기 위해 let minNumer라는 변수를 만들었다.

ii) 작은 수로 분자 분모를 나눈다.

ii-i) 둘 다 나눠 떨어지면 그 나눈 수가 최대 공약수이다.

나눠 떨어진다는 건 무엇을 의미할까? 나머지가 0인것을 의미한는 것이다.  (17번, 18번 줄 참고)

ii-ii) 안나눠 떨어지면 작은 수를 1로 줄이고 ii로 돌아가야 한다. 

새롭게 알게된 점📝

이 문제를 풀려면 최대 공약수를 활용할 줄 알아야 한다.

while문을 사용한 이유는 최대 공약수를 찾기 위해서 이다. 

 

(https://youtu.be/uJ4E_1pvI9c?si=DWe0gckC8ZKGS-6d <- 이 영상을 참고하며 풀었다.)

정답

function solution(numer1, denom1, numer2, denom2) {
   
    
    const numer = (numer1 * denom2) + ( numer2 * denom1);
    const denom = (denom1 * denom2);
    
    // 최대 공약수로 나누기
    // 분자와 분모 중 작은 수를 찾아야 한다.
    // 작은 수에 대한 변수를 만들어 준다.
    let minNumer = 0;
    // 작은 수를 통해서 분자 분모를 나눈다. why? 둘 다 떨어지는 그 작은 수가 최대 공약수이기에..
    if(numer < denom) {
        minNumer = numer;
    } else {
        minNumer = denom;
    }
    
    while(true) {
        if(numer % minNumer === 0) {
            if(denom % minNumer === 0) {
                return [numer/ minNumer, denom/minNumer];
            }
        } 
        minNumer = minNumer -1;
    }
   
}

 

https://school.programmers.co.kr/learn/courses/30/lessons/120808

 

프로그래머스

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

programmers.co.kr

 

728x90