프로그래머스/2레벨

[프로그래머스 2레벨] 숫자 카드 나누기 (C++)

게임개발기원 2025. 2. 19. 20:07
#include <string>
#include <vector>
#include <numeric>

using namespace std;

int solution(vector<int> arrayA, vector<int> arrayB) {
    int answer = 0;

    int Anum = accumulate(arrayA.begin(), arrayA.end(), 0, gcd<int, int>);
    int Bnum = accumulate(arrayB.begin(), arrayB.end(), 0, gcd<int, int>);

    answer = max(Anum, Bnum);

    if(answer == Anum) 
    {
        for(auto i : arrayB) 
        {
            if(i % answer == 0) return 0;
        }
    } 
    else 
    {
        for(auto i : arrayA) 
        {
            if(i % answer == 0) return 0;
        }
    }

    return answer;
}

 

문제 내용을 순차적으로 풀어나가면 되는 문제이다.

먼저 1, 2번 조건을 위해 각 벡터 값에 따른 최대 공약수를 구해준다.

이후 가장 큰 양의 정수 A를 찾기 위해 큰 더 큰 값을 우선 answer에 저장한다.

 

이제 해당 answer의 값이 2가지 벡터에 대해 모두 나누는 경우가 있는 지 체크해야 한다.

만약 answer의 값이 Anum과 같다면 arrayB에 대해 나눠지는 케이스가 있는 지 체크하고,

만약 answer의 값이 Bnum과 같다면 arrayA에 대해 나눠지는 케이스가 있는 지 체크한다.

앞서 answer 값 자체는 이미 구했기에, 만약 나눠지는 케이스가 존재하면 바로 0을 반환해주고 없다면 그대로 answer을 반환하게 된다.