제육's 휘발성 코딩
반응형

약수

  • x에 대해 정수로 나누어떨어지는 수
  • 소수 : 1과 자기자신으로만 나누어 떨어지는 수

최대공약수

  • 2개 이상의 자연수가 공통된 약수를 갖는 수
  • 유클리드 호제법 : 최대공약수를 구하는 알고리즘
    • 2개의 자연수 a,b에 대해서 (a>b 일 때) a를 b로 나눈 나머지를 r
    • a 와 b의 최대공약수는 b와 r의 최대공약수와 같다.
    • 이 과정을 나머지가 0이 되었을 때 까지 반복하여 얻는 수가 최대공약수
static int gcd(int a, int b) {
    while (b != 0) {
        int r = a % b;
        a = b;
        b = r;
    }
    return a;
}
  • 유클리드 호제법 사용 - While 문으로 시간복잡도는 O(n)
static int gcd2(int a, int b) {
    if (a % b == 0) return b;
    return gcd2(b, a % b);
}
  • 재귀함수 사용 시 시간복잡도는 O(logN)이 된다.

최소공배수

  • 2개 이상의 자연수의 공통인 배수
  • 최소공배수와 최대공약수의 관계
    • 두 자연수 A,B 의 최대공약수 : G, 최소 공배수 L 일 때
    • A = a x G, B = b x G (a,b는 서로소) 일 경우
    • L = a x b x G , A x B = L x G
  • 공식만 보면 어렵다.. 예시를 보자
    • 18 과 24 를 비교
    • 18 = gcd(24, 18) * 3
    • 24 = gcd(24, 18) * 4
    • 3 * 4 * gcd(24,18) = 최대공배수가 된다.
    • 또는 18 * 24 / gcd (24, 18) 로 볼 수 있다.
static int lcm (int a, int b) {
    return (a * b / gcd(a, b));
}

예제

  • 두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다. - 프로그래머스
class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];
        if (n > m) {
            answer[0] = gcd(n, m);
            answer[1] = lcm(n, m);
        }
        else {
            answer[0] = gcd(m, n);
            answer[1] = lcm(m, n);
        }
        return answer;
    }

    static int gcd(int a, int b) {
        while (b != 0) {
            int r = a % b;
            a = b;
            b = r;
        }
        return a;
    }

    static int lcm(int a, int b) {
        return a * b / gcd(a,b);
    }
}
반응형
profile

제육's 휘발성 코딩

@sasca37

포스팅이 좋았다면 "좋아요❤️" 또는 "구독👍🏻" 해주세요! 맞구독은 언제나 환영입니다^^