-
Day 1. Multiples of 3 or 5 [6kyu]Code Challenge/codewars 2023. 3. 1. 20:52
문제
주어진 숫자보다 작은 수 중에 3 또는 5의 배수인 값을 더하는 로직. 단, 3과 5 둘 다의 배수일 경우 한 번만 더한다.
For example) 10일 경우, 3 + 5 + 6 + 9 = 23 (작은 수 이므로 10 미 포함)
내 답
처음에 간단하게 썼는데 이 보다 더 빠른 로직은 못 찾았다.
3과 5 따로 계산한 뒤 15를 빼는 로직도 작성해 보았으나 속도가 더 느리게 나왔다. 아마도 동일한 로직을 쓰기에 함수로 뺐더니 함수 호출하는 시간이 소요되고 나눴을 때 소수점 처리를 위해 Math.floor를 써서 효율이 별로인 가보다.
function solution(number){ if(number <= 0) return 0; let sum = 0; for(let i = 1; i < number; i++) { if(i % 3 ==0 || i % 5 == 0) { sum += i; } } return sum; }
다른 사람의 답에서 배운 것
첫 번째는 숫자를 new Array()의 초기 값으로 넣고, keys를 뽑으면 해당 숫자까지의 값이 1씩 증가한 배열이 생성된 다는 것.
→ 다만 keys 자체는 Array Iterator에 불과하므로 filter 로직을 쓰기 위해서는 다시 해당 값들을 풀어서 배열에 다시 넣는 작업이 필요.
두 번째는 reduce 함수
이름에서 연상이 잘 되지 않는다고 생각했는데, 다시 생각해 보니 정말 적절하다.
배열을 하나의 값으로 줄여주는 (reduce) 함수이다.
첫 번째 인자로 결과 값, 두 번째 인자로 현재 값을 받기 때문에, 이 문제에서는 단순하게 최종 결과 값에 현재 값을 더하기만 하면 된다.
Array.prototype.reduce() - JavaScript | MDN
[...new Array(10).keys()] [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] function solution(number){ return number <= 0 ? 0 : [...new Array(number).keys()] .filter((i) => i % 3 == 0 || i % 5 == 0) .reduce((sum, cur) => sum + cur); }
결론
Best answer는 내가 낸 답 이었고, 실제로 다른 사람이 낸 답과 속도 차이가 크지 않긴 하다. 아마도 쉬운 문제라 그런 듯. 쉬운 문제였는데도 불구하고 의미 있었다!
'Code Challenge > codewars' 카테고리의 다른 글
Day 6. Break camelCase [6kyu] (0) 2023.03.06 Day 4. String ends with? [7kyu] (0) 2023.03.04 Day 3. Who likes it? [6kyu] (0) 2023.03.04 Day 2. hello world [8kyu] (0) 2023.03.02 Intro (0) 2023.03.01