✨JSY
article thumbnail

-- 문제

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

 

프로그래머스

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

programmers.co.kr


-- 처음 제출한 답안

function solution(numer1, denom1, numer2, denom2) {
    let num = (numer1 * denom2) + (numer2 * denom1);
    let den = denom1 * denom2;

    let min = findMinDivider(num, den);

    return [num / min, den / min];
}

function findMinDivider(a, b) {
    let divider = 0;

    if (a < b) divider = a;
    else divider = b;

    while(1) {
        if (a % divider === 0 && b % divider === 0) break;
        divider--;
    }

    return divider;
}

-- 정리한 답안

const solution = (numer1, denom1, numer2, denom2) => {
    let [num, den] = [-1, -1];
    // 1. 분자 덧셈 연산
    num = (numer1 * denom2) + (numer2 * denom1);
    den = denom1 * denom2;
    
    // 2. 기약분수 만들기
    // 2-1. 최대공약수 찾기
    // 2-1-a. 분모와 분자 중 최소인 수 찾기
    let min = (num > den) ? den : num;
    
    // 2-1-b. 최소인 수를 시작으로 분모 분자가 최소인 수와 나누어 나머지가 둘 다 0이 될 때까지 반복문
    while (num % min !== 0 || den % min !== 0) min--;
    // 2-2. 각 분모 분자에 최대공약수 나누기 => 답
    return [num / min, den / min];
}

 


-- 피드백

언뜻 보기에 쉬운 문제처럼 보였지만, 분수를 약분하는 과정을 코드로 생각 해내는 데 오래 걸렸다.

중간 과정의 2-1-a 과 2-1-b 를 떠올릴 때 손으로 풀이 과정을 적어보는 과정이 도움이 많이 됐다.

코드를 치기 전에 손으로 풀이를 해보고 flow를 주석으로 다는 습관을 들여야 겠다.

profile

✨JSY

@JUNSANG YOO

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요!