반응형
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
철수와 영희가 가진 각각의 숫자를 입력받을 때, 한 명이 가진 모든 숫자를 나눌 수 있고, 다른 한 명이 가진 모든 숫자를 나눌 수 없는 수를 찾아주세요. (해당되는 숫자가 여러 개라면 가장 큰 수를 반환)
풀이 방법
최대 공약수를 찾는 문제입니다. 유클리드 호제법을 이용하여 최대 공약수를 찾아줘야합니다.
int gcd(int a,int b)
{
if(b == 0)
return a;
return gcd(b, a % b);
}
유클리드 호제법 - 위키백과, 우리 모두의 백과사전
위키백과, 우리 모두의 백과사전. 유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란
ko.wikipedia.org
각 배열의 최대 공약수를 유클리드 호제법을 통해 빠르게 찾아줍니다.
int gcdA = arrayA[0];
int gcdB = arrayB[0];
for (int n : arrayA)
gcdA = gcd(gcdA, n);
for (int n : arrayB)
gcdB = gcd(gcdB, n);
앞서 찾은 최대 공약수가 다른 배열에도 적용이 되는 수인지 체크합니다. 만약 나뉘는 수가 있다면 -1로 바꿔줍니다.
for (int i = 0; i < arrayA.size(); i++)
{
if (arrayA[i] % gcdB == 0)
gcdB = -1;
}
for (int i = 0; i < arrayB.size(); i++)
{
if (arrayB[i] % gcdA == 0)
gcdA = -1;
}
둘 중 더 큰 수를 반환해 줍니다. 둘 다 -1이라면 해당되는 수가 없다는 의미이니 0을 반환합니다.
int answer = max(gcdA, gcdB);
return max(answer, 0);
정답 코드
#include <string>
#include <vector>
#include <iostream>
using namespace std;
int gcd(int a,int b)
{
if(b == 0)
return a;
return gcd(b, a % b);
}
int solution(vector<int> arrayA, vector<int> arrayB)
{
int gcdA = arrayA[0];
int gcdB = arrayB[0];
for (int n : arrayA)
gcdA = gcd(gcdA, n);
for (int n : arrayB)
gcdB = gcd(gcdB, n);
for (int i = 0; i < arrayA.size(); i++)
{
if (arrayA[i] % gcdB == 0)
gcdB = -1;
}
for (int i = 0; i < arrayB.size(); i++)
{
if (arrayB[i] % gcdA == 0)
gcdA = -1;
}
int answer = max(gcdA, gcdB);
return max(answer, 0);
}
반응형
LIST
'알고리즘 문제 > 프로그래머스' 카테고리의 다른 글
프로그래머스 택배상자 (C++) (0) | 2025.01.09 |
---|---|
프로그래머스 롤케이크 자르기 [Lv.2] (C++) (0) | 2025.01.08 |
프로그래머스 귤 고르기 [Lv. 2] (C++) (0) | 2025.01.06 |
프로그래머스 마법의 엘리베이터 [Lv. 2] (C++) (0) | 2025.01.05 |
프로그래머스 무인도 여행 [Lv. 2] (C++) (0) | 2025.01.02 |