본문 바로가기
프론트엔드로 가는 길/프로그래머스

12. 분수의 덧셈(while문)

by woody-j 2022. 11. 21.

※문제설명

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

 

My Solution

function solution(denum1, num1, denum2, num2) { 

// 1 분자/분모
    let sun = num1*denum2 +num2*denum1;
       let mother = num1*num2;
    // 2 분자분모의 최대공약수로 나눠줌
    // 2-1 분자분모중 작은 수를 찾기
    let min=Math.min(sun,mother)
    // 2-2 작은수를 분자분모로 나눠보기
    // 2-2-1 둘다 나누어 떨어지면 그 나눈 수가 최대공약수
    while(true){  
        if(sun%min==0 && mother%min==0){
        return[sun/min,mother/min]
    }
           // 2-2-2 안 나누어떨어지면 작은 수를 1 줄이고 2-2로 돌아가기
       min-=1  
    }
}

 

 

더보기
while문을 사용

while문

 while 문은 소스 코드를 입력한 배열 혹은 객체의 속성에 맞게 반복하여 실행하는 역할을 합니다.

 

 while ([조건절]){ 
      [소스 코드];
   }
   
ex) while문을 이용하여 1 부터 100까지 더하고 그 결과를 출력하시오.
var val = 0;
var i = 0;

while (i<=100){
val = val + i;
i++;
}

 

주의사항

while문의 조건을 true로 하면 while문은 영원히 실행되게 됩니다

이를 조건절로 종료할 수 있도록 처리하기 위해서는 break문을 이용하셔야 합니다.

부족한 점 일단 문제를 어떻게 풀지를 파악하지 못했다. 코드는 어떻게 짜야하는 지 알겠는데 푸는 방법을 몰라 많이 헤맸다. 주석으로 어떤식으로 풀어야하는 지 적고 코드를 작성하는 것이 얼마나 중요한 것인지 알게되었다.

이번 문제는 유튜브를 통해 코드 작성하는 것은 보지 않고 어떤 식으로 풀어야하는 지만 참고해서 풀었다.
개선 방안 주석 사용해서 정리 깔끔하게 하기

 


 

Different Approach

function fnGCD(a, b){
    return (a%b)? fnGCD(b, a%b) : b;
}

function solution(denum1, num1, denum2, num2) {
    let denum = denum1*num2 + denum2*num1;
    let num = num1 * num2;
    let gcd = fnGCD(denum, num); //최대공약수

    return [denum/gcd, num/gcd];
}

 

 

 

참고 유튜브 : https://www.youtube.com/watch?v=uJ4E_1pvI9c 

참고 블로그 : https://m.blog.naver.com/PostView.naver?isHttpsRedirect=true&blogId=diceworld&logNo=220178704694