5 minute read

소수찾기

📝문제 설명

1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
(1은 소수가 아닙니다.)


⚠️제한사항

n은 2이상 1000000이하의 자연수입니다.


📜입출력 예

n result
10 4
5 3
  • 입출력 예 #1: 1부터 10 사이의 소수는 [2,3,5,7] 4개가 존재하므로 4를 반환
  • 입출력 예 #2: 1부터 5 사이의 소수는 [2,3,5] 3개가 존재하므로 3를 반환


✏️코드

  • 내 코드
    #include <string>
    #include <vector>

    using namespace std;

    int solution(int n) {
        int* num = new int[n + 1];
                
        //배열 초기화
        for (int i = 0; i <= n; i++) {
            num[i] = i;
        }

        //2부터 배수를 지워준다
        for (int i = 2; i <= n; i++)
        {
            //num[i] 가 0이면 이미 소수가 아니므로 continue
            if (num[i] == 0)
                continue;

            for (int j = 2 * i; j <= n; j += i)
                num[j] = 0;
        }

        //1은 소수가 아니므로 예외처리
        num[1] = 0;
        
        int answer = 0;
        
        for(int i=2;i<=n;i++){
            if(num[i] != 0){
                answer++;
            }
        
        }
        return answer;
    }
  • 클래스와 상속을 이용한 코드
    /*	8. 문제 설명

        1부터 입력받은 숫자 n 사이에 있는 소수의 개수를 반환하는 함수, solution을 만들어 보세요.
        소수는 1과 자기 자신으로만 나누어지는 수를 의미합니다.
        (1은 소수가 아닙니다.)
    */

    #include<iostream>
    #include<vector>
    #include<string>
    #include<algorithm>

    using namespace std;

    class Util {
    private:
        static bool isDiv(int a, int b);
    public:
        static bool isPrime(int n);
    };

    bool Util::isPrime(int n) {
        int i;
        for (i = 2; i <= n; i++) {
            if (isDiv(i, n)) {
                break;
            }
        }
        if (i == n) {
            return true;
        }
        else {
            return false;
        }
    }

    bool Util::isDiv(int a, int b) {
        return (b % a == 0);
    }

    class P {
    protected:
        int num;

    public:
        P(int n);
        virtual int solution() = 0;
    };

    P::P(int n) :num(n) { ; }

    class P8 :public P {
    private:

    public:
        P8(int n);
        int solution();     // 소수 개수 찾아야함
    };

    P8::P8(int n) :P(n) { ; }

    int P8::solution() {
        int res = 0;

        for (int i = 2; i <= num; i++) {
            if (Util::isPrime(i)) {
                res++;
            }
        }

        return res;
    }

    int main(void) {
        P* p = new P8(5);
        int res = p->solution();

        cout << res;

        return 0;
    }


최대공약수와 최소공배수

📝문제 설명

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요.
배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다.
예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.


⚠️제한사항

두 수는 1이상 1000000이하의 자연수입니다.


📜입출력 예

n m result
3 12 [3,12]
2 5 [1,10]
  • 입출력 예 #1: 위의 설명과 같습니다.
  • 입출력 예 #2: 자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.


✏️코드

  • 내 코드
    #include <string>
    #include <vector>

    using namespace std;
    int getGCD(int n1, int n2){
            int c;

            while(n2 != 0){
                c = n1 % n2;
                n1 = n2;
                n2 = c;
            }

            return n1;
    }

    int getLCM(int n1, int n2){
            return n1 * n2 / getGCD(n1, n2);
        }

    vector<int> solution(int n, int m) {
        vector<int> answer;
        answer.push_back(getGCD(n,m));
        answer.push_back(getLCM(n,m));
        return answer;
    }
  • 클래스 P를 상속받은 코드
    /*	9. 문제 설명

        두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요.
        배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다.
        예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
    */

    #include<iostream>
    #include<vector>
    #include<string>
    #include<algorithm>

    using namespace std;

    class Util {
    private:
        static bool isDiv(int a, int b);
    public:
        static bool isPrime(int n);
    };

    bool Util::isPrime(int n) {
        int i;
        for (i = 2; i <= n; i++) {
            if (isDiv(i, n)) {
                break;
            }
        }
        if (i == n) {
            return true;
        }
        else {
            return false;
        }
    }

    bool Util::isDiv(int a, int b) {
        return (b % a == 0);
    }

    class P {
    protected:
        int num;

    public:
        P(int n);
        virtual int solution() = 0;
    };

    P::P(int n) :num(n) { ; }

    class P9 : public P {
    private:
        int n2;
        int getLCM();   // 최소공배수
        int getGCD();   // 최대공약수

    public:
        P9(int a, int b);
        int solution();
    };

    int P9::getLCM()
    {
        return num * n2 / (getGCD());
    }

    int P9::getGCD()
    {
        int res;
        int a = num, b = n2;

        while (b != 0) {
            res = a % b;
            a = b;
            b = res;
        }

        return a;
    }

    P9::P9(int a, int b) :P(a), n2(b) { ; }

    int P9::solution()
    {
        int gcd = getGCD();
        int lcm = getLCM();

        cout << gcd << "\n" << lcm;

        return 0;
    }

    int main(void) {
        P* p = new P9(3, 12);
        p->solution();

        return 0;
    }


약수의 합

📝문제 설명

정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.


⚠️제한사항

n은 0 이상 3000이하인 정수입니다.


📜입출력 예

n result
12 28
5 6
  • 입출력 예 #1: 12의 약수는 1, 2, 3, 4, 6, 12입니다. 이를 모두 더하면 28입니다.
  • 입출력 예 #2: 5의 약수는 1, 5입니다. 이를 모두 더하면 6입니다.


✏️코드

  • 내 코드
    #include <string>
    #include <vector>

    using namespace std;

    int solution(int n) {
        int answer = 0;

        for(int i=1;i<=n;i++){
            if(n%i==0)
                answer+=i;
        }
            
        return answer;
    }
  • 교수님 코드
    /* 10. 문제 설명

    정수 n을 입력받아 n의 약수를 모두 더한 값을 리턴하는 함수, solution을 완성해주세요.
    */

    #include<iostream>
    #include<vector>
    #include<string>
    #include<algorithm>

    using namespace std;

    class Util {
    private:
        static bool isDiv(int a, int b);
    public:
        static bool isPrime(int n);
    };

    bool Util::isPrime(int n) {
        int i;
        for (i = 2; i <= n; i++) {
            if (isDiv(i, n)) {
                break;
            }
        }
        if (i == n) {
            return true;
        }
        else {
            return false;
        }
    }

    bool Util::isDiv(int a, int b) {
        return (b % a == 0);
    }

    class P {
    protected:
        int num;

    public:
        P(int n);
        virtual int solution() = 0;
    };

    P::P(int n) :num(n) { ; }

    class P10 :public P {
    private:

    public:
        P10(int n);
        int solution();
    };

    P10::P10(int n) :P(n) { ; }

    // 약수 합 구하기
    int P10::solution()
    {
        int count = 0;
        for (int i = 0; i <= num; i++) {
            if (isDiv(i, num)) {
                count += i;
            }
        }

        return count;
    }

    int main(void) {
        P* p = new P10(10);

        cout << p->solution();

        return 0;
    }