Coding test
[프로그래머스] 약수의 개수와 덧셈 (Level 1)
Jiwoo
2022. 4. 19. 17:43
문제
두 정수 left
와 right
가 매개변수로 주어집니다. left
부터 right
까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
- 제한사항
1 ≤left
≤right
≤ 1,000
나의 풀이
function solution(left, right) {
// left ~ right 중
// 약수 짝수인 수 = +n
// 약수 홀수인 수 = -n
// 모두 더한 숫자 반환
let arr = [];
// for: 숫자 하나씩 루프
// for: 숫자 2~n까지 나눔 -> 나머지=0 -> sum +1
// sum % 2 = 0 -> arr.push(+i)
// sum % 2 != 0 -> arr.push(-i)
//arr 모든 후 합 반환
for(let i = left; i <= right; i++) {
let sum = 0;
for(let j = 1; j <= i; j++) {
if(i % j === 0) sum++;
}
arr.push(sum % 2 ? -i : i);
}
return arr.reduce((ac,e) => ac += e, 0);
}
정확도 테스트 결과
살짝 수정해 본 코드
function solution(left, right) { let arr = []; // 약수에 기본 1개(1)을 포함시키고 세보자 for(let i = left; i <= right; i++) { let sum = 1; for(let j = 2; j <= i; j++) { if(i % j === 0) sum++; } arr.push(sum % 2 ? -i : i); } return arr.reduce((ac,e) => ac += e, 0); }
약수에 1은 기본 포함이므로
sum = 1
로 놓는다면 실행시간이 줄지 않을까 싶어서 해봤는데
오히려 실행 시간이 더 많이 나온 테스트가 많다...
역시 정석대로 작성하는 것이 낫다.
- 정확도 테스트 결과
- 정확도 테스트 결과
다른 풀이
- 깔끔한 답안
function solution(left, right) {
let answer = 0;
for (let i = left; i <= right; i++) {
let count = 0;
for (let j = 1; j <= i; j++) {
if (i % j === 0) count++;
}
if (count % 2) answer -= i;
else answer += i;
}
return answer;
}
나처럼 굳이 값을 배열에 넣어서 합하지 않고 바로 바로 계산해주는 풀이법이다.
훨씬 깔끔하고 좋은데, 간혹 위 코드보다 오래 걸리는 테스트가 있다.
- 정확도 테스트 결과
제곱근 = 정수
->약수 개수 = 홀수
function solution(left, right) {
var answer = 0;
for (let i = left; i <= right; i++) {
if (Number.isInteger(Math.sqrt(i))) {
answer -= i;
} else {
answer += i;
}
}
return answer;
}
정수의 제곱근이 정수라는 것은 약수가 홀수 개라는 것을 이용한 코드인데
알면 쉽지만, 생각해내기 결코 쉽지 않은 풀이다.
실행 시간도 가장 적게 걸리는 베스트 코드
정확도 테스트 결과