[프로그래머스Lv1] 최대공약수 최소공배수

JinjuLog·2021년 2월 13일
0

알고리즘

목록 보기
9/12
post-thumbnail

🚩 문제 설명

두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.

제한사항

  • 두 수는 1이상 1000000이하의 자연수입니다.

📝 해결방법

유클리드 호제법이라는 알고리즘을 이용한다.

📝 배운것

  • 유클리드 호제법 또는 유클리드 알고리즘
    2개의 자연수 또는 정식의 최소공약수를 구하는 알고리즘
    호제법이란 두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 나타낸다.

ex)
A 와 B의 최소공약수 = B와 (A%B)의 최소공약수

  • 최대공배수 구하기
    두 수 A*B / A와 B의 최소공약수

👩🏻‍💻 내코드

class Solution {
    public long[] solution(int n, int m) {
        long[] answer = new long[2];

        int nm = n*m;

        if(m > n){
            while(n != 0){
                int r = m % n;
                m = n;
                n = r;
            }

            answer[0] = m;
        }else{
            while(m != 0){
                int r = n % m;
                n = m;
                m = r;
            }
            answer[0] = n;
        }

        answer[1] = nm / answer[0];

        return answer;
    }
}

입력받는 값에서 m과n 중 큰 수와 작은 수를 구분해야한다.

📝 개선사항

class Solution {
    public long[] solution(int n, int m) {
        long[] answer = new long[2];

        int max = (n > m) ? n : m;
        int min = (n < m) ? n : m;

        while(min != 0){
            int r = max % min;
            max = min;
            min = r;
        }  
        answer[0] = max;    
        answer[1] = n*m / answer[0];
        
        return answer;
    }
}

삼항연산자를 이용해서 m과 n 중에서 작은값과 큰 값 나누기

출처 : programmers 최대공약수 최소공배수

0개의 댓글