728x90
문제
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
제한 조건
n은 0 이상 3000이하인 정수입니다.
예시
n | return |
12 | 28 |
5 | 6 |
12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.
실행 코드
파이썬
# Ver.1
def solution(n): # 함수선언, 매개변수 n
li = [] # 약수를 저장하기위한 리스트 선언
# 약수 찾기
for i in range(1,n+1):
if n%i == 0: # n를 i로 나눈 나머지가 0이면 i는 약수
li.append(i) # i를 리스트에 저장
return sum(li) # 모든 약수를 더한 값 반환
# Ver.2
def sumDivisor(n):
# 성능 향상을 위해 num / 2 의 수들만 검사
return n + sum([i for i in range(1, (n // 2) + 1) if n % i == 0])
자바
// Ver.1
// Solution.java
import java.util.ArrayList;
public class Solution {
public int solution(int n) {
int answer = 0;
ArrayList<Integer> arr = new ArrayList<>(); // 리스트 생성
// 약수 구하기
for(int i=1;i<n+1;i++) {
// 나머지가 0이면 약수라는 뜻이므로 리스트에 추가
if(n%i == 0) {
arr.add(i);
}
}
// 약수의 합 구하기
for(int i = 0; i < arr.size(); i++){
answer += arr.get(i);
}
return answer;
}
// 아래는 테스트 출력을 위한 코드입니다
public static void main(String[] args) {
Solution c = new Solution();
System.out.println(c.solution(12));
}
}
// Ver.2
// SumDivisor.java
class SumDivisor {
public int sumDivisor(int n) {
int answer = 0;
// 성능 향상을 위해 n / 2 의 수들만 검사
for(int i = 1; i <= n/2; i++){
if(n%i == 0) answer += i;
}
return answer+n;
}
// 아래는 테스트 출력을 위한 코드입니다
public static void main(String[] args) {
SumDivisor c = new SumDivisor();
System.out.println(c.sumDivisor(12));
}
}
- n/2의 수들만 검사 하는 이유?
n의 약수는 무조건 1과 n이 들어가고 그다음 2이후의 숫자가 들어갈수도 안들어갈수도 있는데
약수 2가 들어간다고 가정한다면 n/2이내의 수만 약수가 되기때문에 n/2 밖의 숫자는 필요없다.
따라서, n/2 이내의 약수(숫자)만 구한 다음 n를 더해준다.
반응형
'Algorithm > Programmers (프로그래머스)' 카테고리의 다른 글
[프로그래머스][MySQL] SELECT - 상위 n개 레코드 (2) | 2024.12.17 |
---|---|
[프로그래머스][레벨1] 자연수 뒤집어 배열로 만들기_연습문제 (0) | 2021.12.09 |
[프로그래머스][레벨1] 자릿수 더하기_연습문제 (0) | 2021.11.23 |
[프로그래머스][레벨1] 평균 구하기_연습문제 (0) | 2021.11.22 |
[프로그래머스][레벨1] x만큼 간격이 있는 n개의 숫자_연습문제 (0) | 2021.11.21 |