본문 바로가기
코테연습

60.약수의 개수와 덧셈 Javascript

by hxunz 2022. 6. 11.

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

 

코딩테스트 연습 - 약수의 개수와 덧셈

두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주

programmers.co.kr

 

 

1. 문제에 대한 이해

  • 우리가 풀어야 할 문제는 무엇인가?
     - 주어진 두 숫자 사이에 모든 수들 중에서 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return
  • 주어진 자료는 무엇인가?
     - left : 정수

     - right : 정수
  • 조건은 무엇인가?
     - left <= right
  • 숨겨진 조건이나 자료가 있는가? 그렇다면 그 것을 다른 방법으로 해석해보라.

2. 계획

  • 이 문제를 푸는데 있어서 유용하게 쓸 수 있는 지식은 무엇인가?
     - reduce
  • 만약 문제를 풀 수 없다면 문제를 더 단순하게 하기 위해서 주어진 조건을 버려보아라
     - left = 13
    right = 14 라고 가정해보자

 

  1. 주어진 두 매개변수 사이의 모든 숫자들을 담은 배열(numbers)을 만든다
  2. 주어진 숫자를 약수로 바꾸고 길이를 구하는 함수(getSubMultipleCount)를 만든다 
  3. numbers를 순회하면서 요소 하나하나를 getSubMultipleCount로 계산해본다. 
  4. submultiple이 짝수이면 numbers의 요소를 더하고 
  5. 그렇지 않으면(홀수이면) 뺀다
  6. 그리고 리턴

 

3. 실행

  • 풀이 계획을 실행하고, 각 단계가 올바른지 점검하라.
const solution = (left, right) => {
  let numbers = [];
  for (num = left; num <= right; num++) {
    numbers.push(num);
  }

  return numbers.reduce((acc, cur) => {
    return getSubMultipleCount(cur) % 2 == 0 ? acc + cur : acc - cur
  }, 0);
};

const getSubMultipleCount = (number) => {
  let submultiple = [];
  for (i = 1; i <= number; i++) {
    if (number % i === 0) {
      submultiple.push(i);
    }
  }
  return submultiple.length;
};

test('count', () => {
  expect(solution(13, 17)).toEqual(43)
});

 

4. 반성

  • 문제를 다른 방식으로 해결할 수 있는가?
     - 제곱근이 정수면 약수의 개수가 홀수인 점을 이용할 수 있을 것 같다.

 

 

우선, 주어진 두 숫자 사이의 모든 정수들을 알아야하니까 
그 정수들을 구하고 배열에 넣어둬야겠다고 생각했다. 

그리고 이 각 정수들의 약수의 개수를 알기 위해서 약수의 개수를 구하는 함수를 따로 만들어야겠다고 생각했다. 
약수를 어떻게 구할 수 있을지 생각해보니까
1부터 해당 숫자까지 나눠지는 수가 있으면 그것이 약수인 점을 생각했고 
이를 토대로 코드를 작성했다. 

그리고 이 함수에 배열 numbers의 수들을 하나씩 대입해봤을때 
약수의 개수가 짝수면 더해주고 홀수면 빼서 총 합계를 구하는 부분은
계속 배열 내 요소들의 반복에다가 누적값을 구하는 것이기 때문에 reduce를 사용했다. 

이렇게 테스트를 전부 다 통과하고 다른 사람들이 푼 것을 보니까 
엄청 간단하게 짜여진 코드를 봤고 
제곱근이 정수면 약수의 개수가 홀수라는 점을 이용해서 푼 부분이 인상적이었다. 

'코테연습' 카테고리의 다른 글

62. 비밀지도 Javascript  (0) 2022.06.14
61. 최소직사각형 Javascript  (3) 2022.06.14
59. 예산 Javascript  (0) 2022.06.08
58. 실패율 Javascript  (0) 2022.06.08
57. 부족한 금액 계산하기 Javascript  (0) 2022.06.08

댓글