230216_TIL

reggias·2023년 2월 16일
0

I learned

목록 보기
40/62
  1. 두 수의 나눗셈을 구하는 문제에서 나는 parseInt() 함수를 사용하였는데 다른 사람의 풀이를 보니 Math.floor나 Math.trunc 등 내가 모르는 함수를 사용하길래 좀 찾아봤음
    정리한 velog 링크
  1. 숫자를 비교하는 문제에서 삼항연산자를 사용하는 사람이 많은데 나는 삼항연산자를 생각도 못했다...
  1. 분수의 덧셈을 구하는 문제에서 어찌저찌 짠 코드가 정답률이 33.3%밖에 나오지않는 이유를 알 수 없다.

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

What was the problem

프로그래머스에서 정답률이 33.3% 밖에 나오지않는데 이유를 알 수 없다.

Things i tried

All code

function solution(numer1, denom1, numer2, denom2) {
    let sumnumer = 0;
    let sumdenom = 0;
    if(denom1 === denom2) {
        sumnumer = numer1 + numer2
        sumdenom = denom1
        return [sumnumer,sumdenom]
    } else if (denom1 !== denom2) {
            let gcd = 1;

            for(let k=2; k<=Math.min(denom1, denom2); k++){
              while((denom1 % k == 0) && (denom2 % k == 0)) {
                 denom1 = Math.floor(denom1 / k);
                 denom2 = Math.floor(denom2 / k);
                 gcd = gcd * k; // 최대공약수
                 continue;
              }
            }
          
            let lcm = denom1 * denom2 * gcd; // 최소공배수
            
            sumnumer = (numer1 * denom2) + (numer2 * denom1)
            sumdenom = lcm
            return [sumnumer,sumdenom]
    }
}
  1. 두 수의 분모가 같으면 분자만 더하면 되고 분모가 다르다면 두 수의 분모를 최소공배수로 만들어준다음 두 수의 분자를 더하여 리턴하도록 하였음.


    2부터 파라미터로 들어온 두 수중 작은 수에 도달할 때까지 k값을 증가시켜 최대공약수를 얻어냄.

    denom1 = 60, denom2 = 48의 수를 받았다고 예를 들면, k가 2부터 두 수중 작은 수인 48에 도달할 때까지 1씩 커짐

    k는 총 min-1, 즉 47번의 반복을 하고 만약 denom1이 k로 나누어 떨어지고, denom2이 k로 나누어 떨어지면 최소공약수는 아니더라도 공약수를 찾은 상태.

    1루프, denom1=60, denom2=48, k=2

    60%2 === 0, 48%2 === 0 while 내부조건 만족

    while 루프 안에서 denom1 = Math.floor(denom1/k)를 수행해 denom1은 30이 되고 denom2 = Math.floor(denom2/k) 를 수행하게 되어 denom2은 24가 됨. gcd는 2가 들어감

    denom1=30, denom2=24는 또 한번 while 루프의 조건을 만족해 denom1=15, denom2=12가 되고 gcd는 4가 들어감. 이후 k의 값인 2로는 나누어 떨어지지않게 됨.

    다음 k는 3이 되고, denom1은 5, denom2은 4, gcd는 12가 들어감. 이후 만족하는 k가 생기지 않아 while 루프에 들어가지 않고 gcd는 최대공약수가 됨.

    결국 서로소가 나올때까지 양쪽 수에 공약수를 나누고 나온 공약수를 전부 곱하면 최대공약수가 나옴.

    최소공배수는 최대공약수 * 2개의 서로소

  1. 여러 임의의 매개변수를 넣어보고 직접 계산도 해보았지만 대체로 이상이 없었음.
> solution(1, 2, 3, 4) // [5, 4]
> solution(9, 2, 1, 3) // [ 29, 6 ]
> solution(50, 14, 65, 22) // [ 1005, 154 ]
> solution(50,14,65,14) // [ 1005, 154 ]

how did you solve it?

해결을 하지 못했음

아래는 다른 사람의 코드 복붙

function solution(denum1, num1, denum2, num2) {
    function gcd(a, b) {
        while (b != 0) {
            let r = a%b;
            a = b;
            b = r;
            };
        return a;
        }

    let denum = denum1*num2 + denum2*num1;
    let num = num1*num2;
    let g = gcd(denum, num);

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

What new did you learn?

참고링크
최대공배수와 최소공약수를 구하는 방법을 알게 됨

profile
sparkle

1개의 댓글

comment-user-thumbnail
2023년 2월 17일

Those same subjects really appeal to me. I'd want to 2048 read articles like this one every day; it's very excellent. There are people in the world who express their opinions, just like you. I really appreciate you publishing such an excellent piece.

답글 달기