자기개발/코딩테스트

C++ (코딩테스트) - 숫자 카드 나누기(프로그래머스)

pi92 2022. 12. 29. 14:50

문제

 

https://school.programmers.co.kr/learn/courses/30/lessons/135807

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

내가 쓴 코드

#include <string>
#include <vector>

using namespace std;

vector<int> factor(int a) {
	vector<int> vec_fac(0);

	if (a <= 0) return vec_fac;

	for (int i = 2; i <= a / 2; i++) {
		if (a % i == 0) { vec_fac.push_back(i); }
	}
	vec_fac.push_back(a);
	return vec_fac;
}

int GetMinValue(vector<int> arr)
{
	int min_value = 100000000;
	for (int i = 0; i < arr.size(); i++)
	{
		if (min_value > arr[i]) min_value = arr[i];
	}
	return min_value;
}

vector<int> GetMaxInt(vector<int> src, vector<int> cmp)
{
	vector<int> res(0);
	int temp;
	for (int i = src.size() - 1; i >= 0; i--)
	{
		temp = src[i];
		for (int j = 0; j < cmp.size(); j++)
		{
			if (cmp[j] % temp == 0)
			{
				temp = 0;
				break;
			}
		}
		if (temp == 0) continue;
		res.push_back(temp);
	}
	return res;
}

int ResultMaxInt(vector<int> MaxInt, vector<int> vec_arr1, vector<int> vec_arr2)
{
	if (MaxInt.size() == 0) return 0;
	int res;
	for (int j = 0; j < MaxInt.size(); j++)
	{
		res = MaxInt[j];
		for (int i = 0; i < vec_arr1.size(); i++)
		{
			if (vec_arr1[i] % res != 0)
			{
				res = 0;
				break;
			}
		}

		for (int i = 0; i < vec_arr2.size(); i++)
		{
			if(res == 0) break;
			if (vec_arr2[i] % res == 0)
			{
				res = 0;
				break;
			}
		}

		if(res != 0) break;
	}

	return res;
}

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

	int minA, minB, resA, resB;
	vector<int> factorA(0), factorB(0);
	minA = GetMinValue(arrayA);
	minB = GetMinValue(arrayB);
	factorA = factor(minA);
	factorB = factor(minB);

	resA = ResultMaxInt(GetMaxInt(factorA, factorB), arrayA, arrayB);
	resB = ResultMaxInt(GetMaxInt(factorB, factorA), arrayB, arrayA);

	return (resA > resB)? resA : resB;
}

 

베스트 코드

#include <bits/stdc++.h>
using namespace std;

int f(int a, int b){return a % b == 0 ? b : f(b, a % b);}
int f(vector<int> &a, vector<int> &b){
    int A = a[0];
    for (int x : a) A = f(max(A, x), min(A, x));
    for (int x : b)
    if (x % A == 0)
        return 0;
    return A;
}
int solution(vector<int> a, vector<int> b) {
    return max(f(a, b), f(b, a));
}

 현타..