-
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이기 때문에 (나누는 값은 항상 그 나누는 값으로 나눈 나머지보다 크다.)
항상 첫 인자로 더 큰 값이 들어오게 되어 유클리드 호제법이 잘 동작하게 된다.
리팩토링을 할 때는 항상 중복되는 로직이 없는지부터 살펴보는 습관을 키워야 할 것 같다.
그리고 좋은 코드를 많이 보고, 인사이트를 많이 얻는 것도 중요할 것 같다.
리팩토링을 잘하는 개발자가 되고 싶다.
어떻게 하면 로직을 더 간단하게 표현할 수 있을지 항상 고민해보자!
'TIL' 카테고리의 다른 글
20221119 TIL 함께하는 것의 힘 (0) 2022.11.19 20221118 TIL 직접 겪어봐야 안다 (0) 2022.11.18 20221116 TIL 다시 만난 자바스크립트 this (0) 2022.11.16 20221115 TIL 자동화를 하자! (2) 2022.11.15 20221114 TIL 백트래킹 알고리즘 (0) 2022.11.14