프로그래머스 알고리즘 LV.1 - 최대공약수와 최소공배수

링크

https://programmers.co.kr/learn/courses/30/lessons/12940

📕내 풀이

function solution(n, m) {
    var answer = [];
    let gcd;
    let lcm;
    
    for (let i = 1; i <= n; i++) {
        if (n % i === 0 && m % i === 0) {
            gcd = i;
        }
    }
    
    lcm = gcd * (n / gcd) * (m / gcd);
    
    answer.push(gcd, lcm);
    
    return answer;
}
  • 문제를 풀때는 애초에 n<=m이라고 가정하고 풀었으나 만약 n>m이라면 for문에서 쓸데없는 연산이 늘어나게 된다. 그전에 if문을 달아 둘중 더 작은 수를 통과하게 하면 더욱 연산이 줄어들것같다
  • lcm을 연습장에 쓴대로 쓰려다 너무 복잡하게 썼다, 결국 lcm = n * m / gcd 라고 쓰는게 더 깔끔했을 것 같다

📘다른사람 풀이 1

  • Math.abs는 절대값을 반환하는 메소드
  • 유클리드 호제법에 대해 알게됐다
  • 3번 줄은 결국 나눠 떨어질때 까지 서로를 나눈 나머지를 계속 나눠주는 알고리즘 이다
  • 혼자 다시 구현해보니 굳이 Math.abs가 필요한지 모르겠다
  • 서로 뒤집어서 계속 계산하는 연산을 재귀함수로 표현할 수 있다는걸 깨달았다

📘다른사람 풀이 2 ⭐️⭐️⭐️⭐️⭐️

  • for문 1번파트를 그냥 변수 선언을 위한 공간으로 쓸수도 있다는걸 깨달았다
  • for문 2번파트는 결국 true가 나오면 동작하고 false가 나오면 정지하므로 좀더 다양한 형태의 조건을 써볼 수 있다는걸 알게됐다. 단순히 true, false만 정해지는 구문이 아니라 변수 값을 계속 지정해주면서 true, false를 정하는 구문을 만들 수 도 있었다.
let a;
console.log(Boolean(a=0)); //false
console.log(Boolean(a=1)); //true
  • ⭐️⭐️⭐️⭐️⭐️ 직접 구현하다가 for문 1번 파트를 변수선언을 위한 공간으로 쓰려면 let 변수선언이 아닌 var 변수선언을 해야한다는걸 깨달았다. var 변수 선언은 자바스크립트엔진이 호이스팅 개념에 의해 스코프 최상단으로 인식한후 초기화 하기 때문에 가능한 것 같다

📝정리

  • 상당히 오래된 알고리즘, 유클리드 호제법에 대해 알게됐다
  • 재귀함수가 들어간 풀이를 처음 이해했다. 나중에 내 풀이에도 활용 해 봐야겠다.
  • for 조건문에 변수선언을 var로 하면 호이스팅 개념에 의해 따로 변수선언하는 코드를 안써도된다

좋은 웹페이지 즐겨찾기