https://school.programmers.co.kr/learn/courses/30/lessons/77884
풀이 - 나의 생각
- 먼저, 1부터 주어진 수의 제곱근까지의 범위에서 반복합니다. 이 범위를 선택하는 이유는 주어진 수의 약수는 해당 수의 제곱근보다 클 수 없기 때문입니다. 만약 제곱근보다 큰 약수가 존재한다면, 해당 약수는 이미 이전에 제곱근 이하의 약수에서 포함되었을 것입니다.
- 주어진 수를 반복하는 동안, 해당 수를 현재 인덱스로 나누어떨어지는지 확인합니다. 나누어떨어지면 현재 인덱스는 해당 수의 약수이므로 카운트를 증가시킵니다.
- 만약 나누어떨어진 수가 현재 인덱스와 같다면, 이는 제곱수임을 의미합니다. 예를 들어, 9의 약수 중 3은 제곱근인 √과 같으므로 제곱수입니다. 따라서 카운트를 증가시킵니다.
- 그렇지 않은 경우에는 현재 인덱스와 나누어떨어진 수의 약수가 모두 카운트에 포함되므로, 카운트를 2 증가시킵니다.
- 반복이 완료되면 약수의 총 개수를 반환합니다.
예를 들어,인 경우
- 일 때, 12를 1로 나누면 나누어떨어지므로 약수이며, 카운트는 +2 증가합니다.
- 일 때, 12를 2로 나누면 나누어떨어지므로 약수이며, 카운트는 +2 증가합니다.
- 일 때, 12를 3으로 나누면 나누어떨어지므로 약수이며, 카운트는 +2 증가합니다.
이렇게 하여 의 약수의 개수는 6이 됩니다.
예를 들어,인 경우
- 일 때, 12를 1로 나누면 나누어떨어지므로 약수이며, 카운트는 +2 증가합니다.
- 일 때, 12를 2로 나누면 나누어떨어지므로 약수이며, 카운트는 +2 증가합니다.
- 일 때, 12를 3으로 나누면 나누어떨어지지 않으므로 약수가 아닙니다.
- 일 때, 12를 4으로 나누면 나누어떨어지고 제곱근이므로, 카운트는 +1 증가합니다.
이렇게 하여 의 약수의 개수는 5이 됩니다.
코드
class Solution {
public int solution(int left, int right) {
int answer = 0;
for(int i = left; i <= right; i++){
if(flag(i)%2 == 0){
answer+=i;
}else{
answer-=i;
}
}
return answer;
}
public int flag(int n){
int count = 0;
for(int i = 1; i <= Math.sqrt(n); i++){
if (n % i == 0) {
if (n / i == i) { // 제곱수인 경우
count++;
} else { // 제곱수가 아닌 경우
count += 2;
}
}
}
return count;
}
}
728x90
'프로그래머스 > Lv.1' 카테고리의 다른 글
코딩테스트 연습 > 푸드 파이트 대회 - JAVA (문자열 뒤집기) (0) | 2024.02.24 |
---|---|
코딩테스트 연습 > 덧칠하기 - JAVA (0) | 2024.02.23 |
코딩테스트 연습 > 약수의 합 - JAVA (0) | 2024.01.16 |
코딩테스트 연습 > 이상한 문자 만들기 - JAVA > 실패 해결 (0) | 2024.01.16 |
코딩테스트 연습 > 소수 찾기 (0) | 2024.01.15 |