⭐ 코딩테스트/프로그래머스
[프로그래머스 C++] 숫자 카드 나누기
Designerd
2023. 12. 21. 10:38
[프로그래머스 C++] 숫자 카드 나누기
https://school.programmers.co.kr/learn/courses/30/lessons/135807
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
해결전략
최대 공약수 GCD
수학, 구현
정답코드
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
// 유클리드 호제법을 사용하여 GCD를 찾음
int gcd(int a, int b){
if (b == 0)
return a;
return gcd(b, a % b);
}
int solution(vector<int> arrA, vector<int> arrB) {
int x = arrA[0];
for(int i = 1; i < arrA.size(); i++){
x = gcd(x, arrA[i]); // 현재까지의 GCD와 다음 요소의 GCD를 계산
}
int y = arrB[0];
for (int i = 1; i < arrB.size(); i++) {
y = gcd(y, arrB[i]); // 현재까지의 GCD와 다음 요소의 GCD를 계산
}
// x와 y 사용 가능 여부를 나타내는 플래그
bool useX = true;
bool useY = true;
if (x == 1 && y == 1) return 0; // GCD가 둘 다 1인 경우, 공통된 소수를 가지지 않으므로 0 반환
else if (x > 1 && y == 1)
{
for (int i = 0; i < arrB.size(); i++) // arrB 내부의 모든 요소가 x로 나누어 떨어지지 않으면 x 반환
{
if (arrB[i] % x == 0) return 0; // 나누어 떨어지면 0 반환
}
return x;
}
else if (x == 1 && y > 1)
{
for (int i = 0; i < arrA.size(); i++) // arrA 내부의 모든 요소가 y로 나누어 떨어지지 않으면 y 반환
{
if (arrA[i] % y == 0) return 0; // 나누어 떨어지면 0 반환
}
return y;
}
else if (x > 1 && y > 1)
{
for (int i = 0; i < arrB.size(); i++) // arrB 내부의 요소 중 x로 나누어 떨어지는 요소가 있으면 useX를 false로 설정
{
if (arrB[i] % x == 0){
useX = false;
break; // 더 이상 확인할 필요 없으므로 반복 종료
};
}
for (int i = 0; i < arrA.size(); i++) // arrA 내부의 요소 중 y로 나누어 떨어지는 요소가 있으면 useY를 false로 설정
{
if (arrA[i] % y == 0){
useY = false;
break;
}
}
if (useX == false && useY == false) return 0; // x와 y 모두 사용할 수 없으면 0 반환
else if (useX && useY == false) return x; // x만 사용할 수 있으면 x 반환
else if (useX == false && useY) return y; // y만 사용할 수 있으면 y 반환
else return x > y ? x : y; // 둘 다 사용할 수 있으면 더 큰 값을 반환
}
}