문제 설명
[내가 짠 코드]
class Solution {
public int solution(int left, int right) {
int answer = 0;
// left에서 right까지 반복
for( int i = left; i <= right; i++){
int count = 0;
// 약수 구하기
for( int j = 1; j <= i; j++){
if(i % j == 0){
count++;
}
}
// 약수가 짝수면 answer에 더하고 홀수면 뺀다.
if(count % 2 == 0){
answer += i;
} else answer -= i;
}
return answer;
}
}
- 이중 for문을 사용해서 문제를 풀었지만 뭔가 깔끔하지 않아서 더 좋은 방법이 없는지 찾아봤다.
[효율성을 높이기 위해 리펙토링]
class Solution {
public int solution(int left, int right) {
int answer = 0;
// left에서 right까지 반복
for (int i = left; i <= right; i++) {
// i의 제곱근을 확인하고 정수이면 약수의 개수가 홀수이다.
if (Math.sqrt(i) == (int)Math.sqrt(i)) {
answer -= i;
} else {
// 정수가 아니라면 약수의 개수가 짝수이다.
answer += i;
}
}
return answer;
}
}
- Math.sqrt(i) : 루트 값을 구하는 double 값을 반환한다.
- 제곱근이 정수(int)로 나올 경우에는 약수의 개수가 홀수이다.
- 예) 9 = √9 = {1, 3, 9} / 16 = √16 = {1, 2, 4, 8, 16}
- 약수의 개수가 홀수인 경우 asnwer에서 해당 숫자를 빼고 짝수인 경우에는 더한다.
결론
코드는 생각할수록 무궁무진하다.
'프로그래머스' 카테고리의 다른 글
[프로그래머스]가운데 글자 가져오기(java) / substing / charAT / String.valueOf() / 트러블 슈팅 (3) | 2024.09.30 |
---|---|
[프로그래머스] 제일 작은 수 제거하기(Java) (1) | 2024.09.27 |
[프로그래머스] 조건문 switch (0) | 2024.09.09 |
[프로그래머스]자릿수 더하기 (0) | 2024.09.07 |
[프로그래머스] 배열의 평균값 - 반복문 활용, 형변환 (0) | 2024.09.06 |