[Node.js_6기 본캠프] Today I Learned_0819

2024. 8. 19. 21:14[Node.js_6기 본캠프 TIL]

▶ 알고리즘 코드카타(JavaScript) - 최대공약수와 최소공배수

 

1) 주어진 코드

function solution(n, m) {
    var answer = [];
    return answer;
}

 

 

2) 조금 슬픈 시간

최대공약수는 큰 수를 작은 수로 나누었을 때, 나머지가 0으로 떨어지면 작은 수가 곧 최대 공약수라는 것까지만 기억이 났다. 아주 먼 옛날... 수학을 좀 더 열심히 공부할걸...

그래도 for문에 if문과 Math.min() Math.max()를 써서 어떻게든 굴리면 

function solution(n, m) {
    var answer = [];
    let Maxnum = Math.max(n, m)
    let Minnum = Math.min(n, m)
    
    
   if(Maxnum % Minnum === 0){
   return Minnum
   }else{ 
   for(let i=1;  // 오... 여기부터 뭔가 잘못된 것을 느꼈다.
   
   }
    
    return answer;
}

 

될 리가 없었다. 의식의 흐름대로 코드를 짜다가 for문에 넣을 조건을 두고 5분 정도 화면만 응시하는 시간을 가졌다.

 

3) 풀이

언젠가 배웠던 유클리드 호제법을 쓰면 쉽게 해결되었다.

 

큰 수를 a, 작은 수를 b라고 할 때, a를 b로 나누었을 때 0이 되면 b가 최대공약수이다. 그렇지 않은 경우 b를 a%b(a를 b로 나누었을 때 남는 나머지 값)로 0이 될 때까지 나누기를 반복해준다. 최소공배수는 a*b/최소공약수 를 해주면 쉽게 구할 수 있다. 이걸 코드로 정리해보면 하기와 같이 정리된다.

function solution(n, m) {
    const gcd = (a, b) => a % b === 0 ? b : gcd(b, a % b);
    const lcm = (a, b) => a * b / gcd(a, b);
    return [gcd(n, m), lcm(n, m)];
}

 

 

끝까지 Math.max와 Math.min 처리를 하려다가 화살표 함수와 삼항연산자를 쓰는 게 더 쉽다는 걸 발견하고 작은 눈물을 흘렸다. 습관적으로 for문과 if문으로 해치우려고 하는 습관이 있는데, 화살표 함수와 삼항연산자를 더 적극적으로 써봐야겠다.