본문 바로가기

알고리즘

분수의 덧셈 - (프로그래머스 코딩테스트 입문)

문제 설명

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

입출력 예

numer1 denom1 numer2 denom2 result
1 2 3 4 [5, 4]
9 2 1 3 [29, 6]
  1. 분모끼리 곱한 값을 다음 분모자리에 두고
  2. 각자의 분자에 상대방의 분모를 곱하여 더하여 다음 분자 자리에 둔다.
  3. 분자와 분모를 최대 공약수로 나누면 된다.

 

문제 풀이

코드에서 최대 공약수를 구하는 방법은 분자, 분모 중 작은 숫자를 기준으로 계속 나눠간다.

둘 다 나누어 떨어지면 그 숫자가 최대 공약수다.

function solution(numer1, denom1, numer2, denom2) {
    var answer = [];
    var num = denom2 *numer1  + denom1 * numer2 // 분자구하기
    var denum = denom1*denom2 // 분모구하기
    
    let minNumber;
    if(denum < num){
        minNumber = denum
        
    } else {
        minNumber = num
    }
    
    // 나누어 떨어진다는 것은 나머지가 0이라는 것.
    // 나머지 연산자는 % 임.
    
    while(true){
    if(denum % minNumber === 0){
        if(num % minNumber === 0){
            //minNumber은 최대 공약수임.
            return [num/minNumber, denum/minNumber]
        }
    } 
     minNumber = minNumber - 1;
}
        
}

// 1. 분모덧셈
// 2. 분자분모의 최대공약수로 나눠줌
// 2-1. 분자분모중 작은 수를 찾기
// 2-2. 작은 수를 분자분모로 나눠보기
// 2-2-1. 둘다 나누어 떨어지면 그 나눈 수가 최대 공약수
// 2-2-2. 안 나누어떨어지면 작은 수를 1 줄이고 2-2로 돌아가기

 

느낀 점

일단 코드로 분수를 푼다는 개념을 아예 몰라 고생을 했다. 그리하여 유튜브강의를 참고하여 하나씩 이해하려 노력했다. 일단 코드 레벨 0 수준이지만,, 나는 갈길이 아직 많이 멀었다고 생각이 들었다.

다시 복습을 해야 하는 문제이고, 다시 풀면서 이해하도록 해야겠다.

 

 

 

🚀 틀린점이 있어 지적할 사항이 있다면, 피드백해주시면 감사하겠습니다. 😊