알고리즘 & 자료구조/코딩테스트

[프로그래머스]약수의 합(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
반응형