[프로그래머스]

프로그래머스 숫자 카드 나누기 C++

Hevton 2023. 8. 19. 11:19
반응형

 

두가지 풀이가 있다. 일단 첫번째 풀이에서는

'리스트에서의 최대공약수는, 리스트의 최솟값을 넘지 않는다' 라는 사실을 이용했다.

#include <string>
#include <vector>
#include <algorithm>
#define MAX(a, b) ((a >= b) ? a : b)

using namespace std;

int find(vector<int>& v1, vector<int>& v2, int min) {
    
    for(int i = min; i > 1; i--) {
        
        bool flag = true;
        
        for(auto v : v1) {
            
            if(v % i != 0) {
                flag = false;
                break;
            }
        }
        
        if(flag) {
            
            bool final = true;
            
            for(auto v : v2) {
                
                if(v % i == 0) {
                    final = false;
                    break;
                }
            }
            
            if(final)
                return i;   
        }
    }
    return 0;
}

int solution(vector<int> arrayA, vector<int> arrayB) {
    int answer = 0;
    
    // 각 리스트의 최대공약수는, 각 리스트의 최솟값을 넘지 않겠지요
    int minA = *min_element(arrayA.begin(), arrayA.end());
    int minB = *min_element(arrayB.begin(), arrayB.end());
    
    
    return MAX(find(arrayA, arrayB, minA), find(arrayB, arrayA, minB));
}

min_element를 처음 활용해보는 기회였다.

 

 

두번째는 GCD 함수를 구현하는 방식이다.

런타임 시간이 엄청나게 절약되었다.

#include <string>
#include <vector>
#define MAX(a, b) ((a > b) ? a : b)

using namespace std;

int gcd(int a, int b) {
    
    int temp;
    while(b != 0) {
        temp = a;
        a = b;
        b = temp % b;
    }
    return a;
}

int findValue(vector<int>& v1, vector<int>& v2, int size) {
        
    int gcdValue = v1[0];
    
    for(int i = 1; i < size; i++) {
        gcdValue = gcd(gcdValue, v1[i]);
        
        if(gcdValue == 1) return 0;
    }
    
    for(auto v : v2) {
        if(v % gcdValue == 0)
            return 0;
    }
    
    return gcdValue;
    
}

int solution(vector<int> arrayA, vector<int> arrayB) {
    int answer = 0;
    
    int size = arrayA.size();
    
    int a = findValue(arrayA, arrayB, size);
    int b = findValue(arrayB, arrayA, size);
    
    return MAX(a, b);
}
반응형