문제
정수 n을 입력받아 n의 약수 모두 더한 값을 리턴하는 함수, solution을 완성해주세요
제한 사항
- n은 0 이상 3000이하인 정수입니다.
입출력 예
- 입출력 예 #1
12의 약수는 1, 2 ,3 ,4 ,6, 12입니다. 이를 모두 더하면 28입니다. - 입출력 예 #2
5의 약수는 1,5입니다. 이를 모두 더하면 6입니다.
function solution(num) {
const arr = [];
// 먼저 i값의 반복문을 돌려준다.
for (let i = 0; i < num; i++) {
// input을 나눌때 나머지가 0인 정수를 모조리 찾아주고
// 모든 숫자를 배열에 넣어 누적 합사후 합계를 반환한다.
// 하지만 0 부터 input 까지 숫자를 1씩 더해가며 계산해야하므로 시간 복잡도가 상당하다.
if (num % i === 0) arr.push(i);
}
return arr.reduce((a, c) => a + c, 0);
}
- input을 나누었을때 나머지가 0인 정수를 모조리 찾는다.
- 모든 숫자를 배열에 넣어 누산 후에 합계를 반환
- 하지만 0 부터 input까지 숫자를 1씩 더해가면서 계산하므로 시간 복잡도 상당
function solution(num) {
let sum = 0;
for (let i = 1; i <= num; i++) {
if (num % i === 0) sum += i
}
return sum
}
- sum의 초기값으로 0을 넣고 for문을 돌러 i가 num보다 작거나 같을때 i값을 증가시키고
- num 과 i를 나눈 값이 0과 같다면 sum을 i값으로 할당시키면 된다.
멘토님 풀이법
function solution(n) {
let answer = n;
// n만 큼의 길이만큼 반복문 실행
// n을 2만큼 나눈 값까지 만 반복문 실행
for( let i = 1; i <= n/2; i++) {
// n을 i로 나눈 값에 나머지가 0이 아닌것을 출력
if(n % i === 0) {
// answer의 i값을 더해주면됨
answer += i;
}
}
return answer;
}
function solution(n) {
// Number 타입은 문자열이 아니라 split 사용불가
// 그래서 빈배열에 만들어야함
// n만큼ㅁ을 길이를 가지는 빈배열
const answer = new Array( n ) // 해당 갯수에 맞는 배열 생성
// 다 1로 채워줌
.fill(1) // 배열의 데이터마다 해당 인자 데이터를 할당
// reduce 최대 2개
.reduce((cu,el, i) => {
// 1부터 n까지 포함한 숫자 가져옴
const num = el + i;
// 연산
return n % num === 0
// 약수
? cu + num
// 약수 아니면 가지고 있는 데이터 그대로 다음 반복문에 던져줌
: cu
},0)
return answer;
// 비워있어 실제로 사용하지 못하는 데이터
//지금 상태로는 어떠한 반복문도 사용 x
// 메서드를 사용할 수 있게
// console.log(answer[0])
// console.log(answer)
}
'etc. > Algorithm' 카테고리의 다른 글
[프로그래머스] 자릿수 더하기 (0) | 2022.01.20 |
---|---|
[프로그래머스 코딩테스트] 서울에서 김서방 찾기 (0) | 2022.01.19 |
[알고리즘 테스트] 가운데 글자 가져오기 (0) | 2022.01.18 |