알고리즘 & 자료구조/코딩테스트
[프로그래머스]약수의 합(C++)
인디아나쥰이
2021. 2. 16. 16:14
문제 설명
정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
제한 사항
- n은 0 이상 3000이하인 정수입니다.
입출력 예
n return
| 12 | 28 |
| 5 | 6 |
입출력 예 설명
입출력 예 #1
12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.
입출력 예 #2
5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.
1.단순하게 하나하나 탐색하며 약수를 찾아내서 더하는 방법
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(int n) {
int answer = 0;
for(int i = 1; i <= n; i++)
{
if(n%i == 0)
{
answer = answer + i;
if(n/i == i)
{
continue;
}
else{
answer = answer + (n/i);
}
}
}
return answer;
}
//테스트 실행용
int main(void)
{
int n;
cin >> n;
cout << solution(n);
}
2.중복을 제거하여 구하는 방법
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int solution(int n) {
int answer = 0;
for(int i = 1; i*i <= n; i++)
{
if(n%i == 0)
{
answer = answer + i;
if(n/i == i) // 같은 약수 (루트 값) 인 경우 두번 더해주는것을 피하기 위한 코드
{
continue;
}
else{
answer = answer + (n/i);
}
}
}
return answer;
}
int main(void)
{
int n;
cin >> n;
cout << solution(n);
}
위의 if문의 경우는
예를 들어 36의 약수를 구할때 6 x 6 인 경우, 6을 두번 더해주는것을 피하기 위해 중복되는 약수가 나오는경우는
n/i 한 값을 더해주지 않고 무시 하게 해주었다
728x90
반응형