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 라고 가정해보자
- 주어진 두 매개변수 사이의 모든 숫자들을 담은 배열(numbers)을 만든다
- 주어진 숫자를 약수로 바꾸고 길이를 구하는 함수(getSubMultipleCount)를 만든다
- numbers를 순회하면서 요소 하나하나를 getSubMultipleCount로 계산해본다.
- submultiple이 짝수이면 numbers의 요소를 더하고
- 그렇지 않으면(홀수이면) 뺀다
- 그리고 리턴
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 |
댓글