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

jahlee·2023년 4월 23일
0

프로그래머스_Lv.2

목록 보기
37/106
post-thumbnail

같은 배열 안에서의 공통 약수를 찾고 이 약수가 다른 배열의 약수가 아니면 되는 문제이다.
때문에 굳이 모든 수들의 약수를 구할 필요는 없고 해당 배열의 가장 작은 최소값의 약수를 구해 조건을 만족시켜주면 된다.

#include <string>
#include <vector>
#include <algorithm>
using namespace std;

bool is_rest (int num, vector<int> array)
{
    for(auto c : array) if (c%num) return true;
    return false;
}

bool is_norest(int num, vector<int> array)
{
    for(auto c : array) if (c%num==0) return true;
    return false;
}

int func(int n, vector<int> array, vector<int> compare)
{//n은 해당 배열의 가장 최소값, array 해당 배열, compare 다른 배열
    for (int i = n; i > 1; i--)
    {//해당 배열에서 조건에 만족하는 가장 큰 약수만을 필요로 하기 때문에
        if (n % i == 0)
        {//약수이면
            if(is_rest(i, array)) continue;//해당배열내에서 공용인 약수이면
            if(is_norest(i, compare)) continue;//다른 배열내에서 약수이면
            return i;
        }
    }
    return 0;
}

int solution(vector<int> arrayA, vector<int> arrayB)
{
    sort(arrayA.begin(), arrayA.end());//오름차순 정렬(가장 작은값을 기준으로 할것이기 때문)
    sort(arrayB.begin(), arrayB.end());//마찬가지
    //func을 돌린 값중 큰값 리턴
    return max(func(arrayA[0], arrayA, arrayB), func(arrayB[0], arrayB, arrayA));
}

0개의 댓글