약수의 개수와 덧셈
두 정수 left와 right가 매개변수로 주어집니다. left부터 right까지의 모든 수들 중에서, 약수의 개수가 짝수인 수는 더하고, 약수의 개수가 홀수인 수는 뺀 수를 return 하도록 solution 함수를 완성해주세요.
- 1 ≤ left ≤ right ≤ 1,000
| 13 | 17 | 43 |
| 24 | 27 | 52 |
풀이 과정
1. left ~ right 해당하는 범위의 숫자 배열 구하기
2. 범위 내에서 제곱수가 아닌 수만 더하기 ( 제곱수가 아니라는 건 약수의 개수가 짝수인 거랑 같은 의미)
이대로 생각하고 코드를 처음 작성했을 때는 아래와 같은 방법으로 작성했다.
function solution(left, right) {
const newArr = Array.from({length: right - left + 1 },(v,k)=> k + left )
const newArrSum = newArr.reduce((a,b) => a + b)
const cal = newArr.map((i) => Math.sqrt(i)).filter((i) => Number.isInteger(newArr[i])).map((i) => i ** 2).reduce((a,b) => a+b)
return newArrSum - cal
}
,,,,ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
이렇게 했더니 런타임 error가 발생했다.
지금 저걸 다시 보니까 제곱근을 구했다가 다시 제곱 계산을 하고 난리도 아닌 거 같다.
그래서 다시 수정한 코드가
function solution(left, right) {
const newArr = Array.from({length: right - left + 1 },(v,k)=> k + left )
const test = newArr.map((i) => Math.sqrt(i)).filter((j) => (j % 1) === 0 ).map((i) => i ** 2)
const sumTest = test.reduce((a,b) => a +b)
const intersection = newArr.filter((x) => !test.includes(x)).reduce((a,b) => a + b ) - sumTest
return (intersection)
}
위와 같은 코드인데 사실 이것도 처음 쓴 코드랑 크게 다르지 않다.
한 변수에 몰았던 함수 연산들을 분산시킨 것 밖에 없다.
좀 변경된 건 합을 구할 때 차집합 연산 함수를 사용해본 거 정도?
제출을 해서 런타임 에러 없이 통과는 됐는데 원하는 코드 느낌은 저게 아니었다.ㅠㅠ
더 간단하고, 변수를 계속 만들기보단 주어진 조건을 최대한 활용해보고 싶었다.
그리고 제곱수는 약수의 개수가 홀수이다 를 잘 활용하면 훨씬 간단해질 거 같은데
맘처럼 생각이 안 돌아가서 간단한 답 앞에서 빙글빙글 돌고 있다는 생각이 계속 들었다. 😥
답을 확인하고 다른 사람 코드를 보니까 아,, 왜 이 생각을 못했지? 하는 생각이 들었다.
조건으로 left, right 숫자를 주니까 해당 값으로 반복문 범위를 정해준 다음, 제곱근을 계산해주고, 이 값을 정수 판별 함수를 통해서 다시 정수로 만들어서 연산해주면 된다.
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;
}
참,, 6시 반부터 9시 반까지 2시간 동안 빙빙 돌아온 거 같아서 답답했다,, 🤮😩
열심히 알고리즘 문제 연습하다 보면 명료한 코드를 짧은 시간에 생각하고 작성할 수 있겠지,,ㅠㅠ 🙏🙏🙏
'알고리즘' 카테고리의 다른 글
| [프로그래머스][JS] Lv.2 최댓값과 최솟값 (0) | 2022.10.20 |
|---|---|
| [프로그래머스][JS] Lv.1 없는 숫자 더하기 (1) | 2022.10.11 |
| [프로그래머스][JS] Lv.1 나누어 떨어지는 숫자 배열 (1) | 2022.09.23 |
| [프로그래머스][JS] Lv.1 음양 더하기 (0) | 2022.09.22 |
| [프로그래머스][JS] Lv.1 두 정수 사이의 합 (1) | 2022.09.21 |