문제
두 정수 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;
}
정수의 제곱근이 정수라는 것은 약수가 홀수 개라는 것을 이용한 코드인데
알면 쉽지만, 생각해내기 결코 쉽지 않은 풀이다.
실행 시간도 가장 적게 걸리는 베스트 코드
정확도 테스트 결과
'Coding test' 카테고리의 다른 글
[프로그래머스] 최소 직사각형 (Level 1) (0) | 2022.04.20 |
---|---|
[프로그래머스] 3진법 뒤집기 (Level 1) (0) | 2022.04.19 |
[프로그래머스] 음양 더하기 (Level 1) (0) | 2022.04.19 |
[프로그래머스] 두 개 뽑아서 더하기 (Level 1) (0) | 2022.04.19 |
[프로그래머스] K번째 수 (Level 1) (0) | 2022.04.19 |