-- 문제
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를 주석으로 다는 습관을 들여야 겠다.
'PS > 프로그래머스' 카테고리의 다른 글
[프로그래머스 / JavaScript] 구명보트 (0) | 2024.04.21 |
---|---|
[프로그래머스 / JavaScript] 숫자의 표현 (0) | 2024.04.14 |
[프로그래머스/JavaScript] 최빈값 구하기 (0) | 2023.12.25 |