2023
03.31

출처: 프로그래머스 코딩 테스트 연습
https://school.programmers.co.kr/learn/courses/30/lessons/135807

 

 

나의 풀이

public int solution(int[] arrayA, int[] arrayB) 
{
    int a = GetMaxValue(arrayA, arrayB);
    int b = GetMaxValue(arrayB, arrayA);
    return a > b ? a : b;
}

private int GetMaxValue(int[] my, int[] other)
{
    int n = my[0];
    foreach(int num in my)
        n = GCD(n, num);

    foreach(int num in other)
    {
        if(num % n == 0)
            return 0;
    }
    return n;
}

private int GCD(int a, int b)
{
    if(b == 0) return a;
    return GCD(b, a % b);
}

우선 문제해석

 

철수가 가진 카드들에 적힌 모든 숫자를 나눌 수 있고 -> 최소공배수

영희가 가진 카드들에 적힌 모든 숫자들 중 하나도 나눌 수 없는 양의 정수 -> 완전탐색으로 하나씩 비교

 

영희 철수를 반대로 한번 더 구해서 둘 중 큰 것을 반환하면 된다.

여러 수의 최소 공배수는 반복문으로 1번숫자, 2번 숫자의 공배수 구하고,

나온 수를 다시 3번이랑 공배수구하고 하는 식으로 구할 수 있다.

 

 단순 반복문 돌렸을 때 시간초과가 나겠지 싶어서 그냥 풀었는데 의외로 그냥 통과.

 

최소 공배수 공식인 유클리드 호재법은 개념은 숙지해도 코드는 까먹기 쉬우니 다시 체크.

private int GCD(int a, int b)
{
    if(b == 0) return a;
    return GCD(b, a % b);
}
private int GCD(int a, int b)
{
    int c;
    while(b != 0)
    {
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}