ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 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
Designed by Tistory.