반응형
문제 링크
코딩테스트 연습 - 약수의 합 | 프로그래머스 (programmers.co.kr)
문제 풀이
1번 풀이
- 약수를 구하는 방법
어떤 수를 나눈 나머지가 0인 경우 약수
public int solution(int n) {
int sum = n;
for (int i = 1; i <= n / 2; i++) {
if (n % i == 0) sum += i;
}
return sum;
}
테스트 처리속도
테스트 | 속도 |
---|---|
테스트 1 〉 | 통과 (0.02ms, 73.6MB) |
테스트 2 〉 | 통과 (0.01ms, 78MB) |
테스트 3 〉 | 통과 (0.05ms, 81.7MB) |
테스트 4 〉 | 통과 (0.02ms, 75MB) |
테스트 5 〉 | 통과 (0.04ms, 76.5MB) |
테스트 6 〉 | 통과 (0.03ms, 71.5MB) |
테스트 7 〉 | 통과 (0.04ms, 72MB) |
테스트 8 〉 | 통과 (0.03ms, 72MB) |
테스트 9 〉 | 통과 (0.03ms, 73.5MB) |
테스트 10 〉 | 통과 (0.06ms, 70.5MB) |
테스트 11 〉 | 통과 (0.03ms, 72.6MB) |
테스트 12 〉 | 통과 (0.06ms, 68.3MB) |
테스트 13 〉 | 통과 (0.01ms, 72.9MB) |
테스트 14 〉 | 통과 (0.04ms, 72.9MB) |
테스트 15 〉 | 통과 (0.03ms, 72MB) |
테스트 16 〉 | 통과 (0.02ms, 76.8MB) |
테스트 17 〉 | 통과 (0.04ms, 73.3MB) |
2번 풀이
- 자기 자신을 제외한 모든 약수는 자신의 절반 이하이다.
예) 12의 약수는 {1, 2, 3, 4, 6, 12}
자기 자신인 12를 제외한 모든 약수는 12의 절반인 6 이하이다.
이를 활용해 구하고자 하는 값의 수행속도를 줄일 수 있다.
import java.util.HashSet;
public int solution(int n) {
HashSet<Integer> set = new HashSet<Integer>();
for(int i=1; i<=Math.sqrt(n); i++) {
if(n % i == 0) {
set.add(i);
set.add(n / i);
}
}
return set.stream().mapToInt(Integer::intValue).sum();
}
- 모든 약수는 짝이 있으며 그 짝의 작은 값은 자신의 제곱근을 초과할 수 없다.
- 예) 16의 제곱근은 4 / 16의 약수는 {1, 2, 4, 8, 16}
짝 : 1 - 16
짝 : 2 - 8
짝 : 4 - 4 - 즉, 약수의 합을 구하기 위해서는 제곱근 이하의 값(1, 2, 4)만 구하면 되고 해당 값을 구하면 나머지(16, 8, 4)를 구할 수 있다.
16 / 1 = 16
16 / 2 = 8
16 / 4 = 4 - HashSet을 사용한 이유는 중복을 제거하기 위해서 사용했다. (예를 들어 16의 약수 중 4)
- 예) 16의 제곱근은 4 / 16의 약수는 {1, 2, 4, 8, 16}
테스트 처리속도
테스트 | 속도 |
---|---|
테스트 1 〉 | 통과 (2.20ms, 79.1MB) |
테스트 2 〉 | 통과 (2.40ms, 83.2MB) |
테스트 3 〉 | 통과 (1.65ms, 76.5MB) |
테스트 4 〉 | 통과 (1.49ms, 80.6MB) |
테스트 5 〉 | 통과 (1.48ms, 79.5MB) |
테스트 6 〉 | 통과 (1.38ms, 70.2MB) |
테스트 7 〉 | 통과 (1.54ms, 71.8MB) |
테스트 8 〉 | 통과 (1.55ms, 76.2MB) |
테스트 9 〉 | 통과 (2.52ms, 85.4MB) |
테스트 10 〉 | 통과 (2.34ms, 72.1MB) |
테스트 11 〉 | 통과 (1.21ms, 74.8MB) |
테스트 12 〉 | 통과 (1.59ms, 82.9MB) |
테스트 13 〉 | 통과 (2.13ms, 83MB) |
테스트 14 〉 | 통과 (1.41ms, 71.1MB) |
테스트 15 〉 | 통과 (3.55ms, 73.7MB) |
테스트 16 〉 | 통과 (1.59ms, 82MB) |
테스트 17 〉 | 통과 (1.42ms, 74.5MB) |
문제풀이별 수행속도 차이
빠르게 구할 수 있는 작은 수의 값에 1번 풀이는 빠른 속도가 나오지만 크고 복잡한 수에서는 급격하게 느려진다.
2번 풀이는 매번 비슷한 수행속도를 보인다.
문제에서 주어진 것처럼
반응형
'Algorithm > Java' 카테고리의 다른 글
프로그래머스 - 문자열 다루기 기본 java (0) | 2022.01.04 |
---|---|
프로그래머스 - 문자열을 정수로 바꾸기 java (0) | 2022.01.04 |
프로그래머스 - 자릿수 더하기 java (0) | 2021.12.28 |
프로그래머스 - 정수 내림차순으로 배치하기 java (0) | 2021.12.27 |
프로그래머스 - 제일 작은 수 제거하기 java (0) | 2021.12.22 |