한 걸음씩
[프로그래머스][JS] 약수의 합 본문
https://school.programmers.co.kr/learn/courses/30/lessons/12928
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
풀이 과정
function solution(n) {
let answer = 0;
for (let i = 1; i <= n; i++){
if (n % i === 0){
answer += i
}
}
return answer;
}
리뷰
반복문을 돌려서 배열의 총합을 구하려다가 reduce라는 메서드를 발견해서 사용해봤는데
함수를 정확하게 이해하지 못한 나에게는 어려운 메서드였다..
// 틀린 코드
function solution(n) {
let answer = [1];
for (let i = 2; i <= n; i++){
if (n % i === 0){
answer.push(i)
}
}
const sum = answer.reduce((accumulator, currentValue) =>
accumulator + currentValue)
return sum;
}
// 테스트 케이스 몇 개를 통과 못했는데 비효율적인 코드이긴하나 약수를 구한다는 점에서는 코드를 똑바로 짠 것 같은데
// 어떤 테스트 케이스를 통과 못한걸까
reduce() 메서드는 배열의 각 요소를 순회하면서 인자로 전달된 콜백 함수를 실행한다.
이때 콜백 함수는 누적값(accumulator)과 현재값(currentValue)을 인자로 받는다.
accumulator = 0라는 변수를 생성해두고 for문을 돌렸을때 accumulator += currentValue 이것과 같은 말
콜백 함수가 실행될 때마다 누적값에 현재값을 더해줌으로써 모든 요소를 더한 값을 구할 수 있다.
위 코드에서는 화살표 함수를 사용하여 콜백 함수를 정의하였다. 이때 콜백 함수는 누적값(accumulator)과 현재값(currentValue)을 인자로 받아서 두 값을 더한 결과를 반환한다. reduce() 메서드는 각 콜백 함수의 반환값을 다시 누적값으로 사용한다. 따라서 배열의 마지막 요소까지 순회한 후 최종적으로 구한 누적값이 변수 sum에 저장된다.
코드에서는 reduce() 메서드의 두 번째 인자를 생략하였는데, 이 경우 reduce() 메서드는 배열의 첫 번째 요소를 초기값으로 사용한다. 따라서 위 코드는 배열의 모든 요소를 더하는 것이다. 만약 초기값을 지정하고 싶다면 reduce() 메서드의 두 번째 인자로 초기값을 전달해 주면 된다.
https://developer.mozilla.org/ko/docs/Web/JavaScript/Reference/Global_Objects/Array/reduce
Array.prototype.reduce() - JavaScript | MDN
reduce() 메서드는 배열의 각 요소에 대해 주어진 리듀서 (reducer) 함수를 실행하고, 하나의 결과값을 반환합니다.
developer.mozilla.org
근데 문제에서 요구한 것은 약수의 합이기 때문에 배열에 push해서 따로 총합을 구할 필요가 없고
반복문을 돌리면서 약수를 찾음과 동시에 누적합을 구하면되는 문제였다!
'Programmers' 카테고리의 다른 글
[프로그래머스][JS] 나누어 떨어지는 숫자 배열 (0) | 2023.04.06 |
---|---|
[프로그래머스][JS] 나머지가 1이 되는 수 찾기 (0) | 2023.04.06 |
[프로그래머스][JS] 중복된 문자 제거 (0) | 2023.04.05 |
[프로그래머스][JS] 직각삼각형 출력하기 (0) | 2023.04.05 |
[프로그래머스][JS] 인덱스 바꾸기 (0) | 2023.04.05 |