ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 20221117 TIL 항상 코드를 더 낫게 만들 방법이 있다
    TIL 2022. 11. 17. 21:18

     

    오늘은 나름 간단한 코딩 문제를 풀어보았다.

    어제 풀었던 문제라 금방 풀었다.

    시간이 조금 남아서 리팩토링을 해보려 했는데, 

    유클리드 호제법을 사용하지 않았을 때보다 코드가 이미 많이 간단해졌기 때문에

    더 이상 어떻게 더 낫게 만들 수 있을지 감이 잡히지 않았다.

    function greatestCommonDivisor(x, y) {
      if (x === y) {
        return x;
      }
    
      if (x > y) {
        if (x % y === 0) { // 1️⃣
          return y;
        }
    
        return greatestCommonDivisor(y, x % y); // 2️⃣
      }
    
      return greatestCommonDivisor(y, x);
    }

     

    그런데 홀맨님께서 너무나 깔끔한 풀이법을 올려주셨다.

    function gcd(a, b) {
        return b === 0 ? a : gcd(b, a % b);
    }

     

    처음에는 이 코드를 이해하기가 어려웠는데, 이 코드를 살펴보다 보니,

    나의 코드에서도 리팩토링을 어떻게 할 수 있었을지 떠올랐다.

     

    코드 리팩토링의 가장 쉬운 방법 중 하나는 중복 없애기이다.

    1️⃣, 2️⃣ 에서 동일한 코드가 보인다.

    바로 x % y이다.

    이를 중심으로 리팩토링을 해보려는 시도를 했으면 좋았을 것 같다.

    코드의 depth를 최대한 줄일 수 있다면 좋기 때문에,

    1️⃣에서 x % y 가 0인지를 판단하지 말고, 2️⃣에서 들어간 값인 x % y가 0인지 판단을 하면 되는 것이다.

    즉,1️⃣의 로직은 greatestCommonDivisor의 두번째 인자가 0인지 판단해서 두번째 인자가 0일 때의 첫번째 인자를 반환해주는 것으로 대체할 수 있다.

    그리고 이 방법의 장점은 x === y인지 판단하는 조건문도 없앨 수 있다는 것이다.

     

    그리고 홀맨님의 풀이를 보다가 깨닫게 된 점도 있었다.

    greatestCommonDivisor의 인자 두 개의 값의 크기를 굳이 비교할 필요가 없었다.

    유클리드 호제법으로 최대공약수를 구하려면 큰 값을 작은 값으로 나눈 나머지를 구해야 한다.

    따라서 첫 인자로 큰 값, 두번째 인자로 작은 값이 들어와야할 것 같았는데,

    사실 이 비교도 필요가 없었다.

    function greatestCommonDivisor(x, y) {
      if (y === 0) {
      	return x;
      }
      
      return greatestCommonDivisor(y, x % y); // ⭐️
    }

     

    왜냐하면 위 코드에서 만약 x < y인 상황이라고 해보자.

    작은 값을 큰 값으로 나눈 나머지는 작은 값 그대로이다.

    따라서 ⭐️에서 greatestCommonDivisor(y, x)가 대입되어,

    처음에는 첫 인자로 작은 값이 들어왔더라도,

    결국 큰 값이 첫 인자로 들어오게 되고, 항상 y > x % y이기 때문에 (나누는 값은 항상 그 나누는 값으로 나눈 나머지보다 크다.)

    항상 첫 인자로 더 큰 값이 들어오게 되어 유클리드 호제법이 잘 동작하게 된다.

     

    https://www.itech-progress.com/wp-content/uploads/2021/04/clean_Code.png

    리팩토링을 할 때는 항상 중복되는 로직이 없는지부터 살펴보는 습관을 키워야 할 것 같다.

    그리고 좋은 코드를 많이 보고, 인사이트를 많이 얻는 것도 중요할 것 같다.

    리팩토링을 잘하는 개발자가 되고 싶다.

    어떻게 하면 로직을 더 간단하게 표현할 수 있을지 항상 고민해보자!

    댓글

Designed by Tistory.