본문 바로가기

Coding Test/프로그래머스 연습

[JAVA] 최대공약수와 최소공배수 (feat. 유클리드 호제법..)

문제 설명

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

 

👽내 코드

class Solution {
    public int[] solution(int n, int m) {
        int max = 0;
        int min = 0;
        
        int a = n;
        int b = m;
        
        //최대공약수 구하기
        while (b != 0) {
            int temp = b;
            b = a % b;
            a = temp;
         }
        max = a;
        
        //최소공배수 구하기
        min = (n * m)/max;
        
        int[] answer = new int[]{max,min};
        return answer;
    }
}

 

유클리드 호제법

 

1. b가 0이 될때까지 while문 반복

2. temp에 b 저장

3. a % b 로 나머지 구해서 b로 저장

4. temp를 다시 a에 저장해서 while문 반복

 

저번 가우스 공식부터 점점 수학 공식이 나온다...

 

🌈다른 풀이

class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];
        for (int i = 1; i < n + m; i++) {
            if (n % i == 0 && m % i == 0) {
                answer[0] = i;
                answer[1] = n * m / answer[0];
            }
        }
        return answer;
    }

}

 

처음에 생각했던  방법. for문으로 순차적으로 돌려주기.

i를 찾았다면 break를 걸어주어도 좋을 것

 

import java.util.Arrays;

class Solution{
      public int[] gcdlcm(int a, int b) {
        int[] answer = new int[2];

        answer[0] = gcd(a,b);
        answer[1] = (a*b)/answer[0];
        return answer;
    }

   public static int gcd(int p, int q)
   {
    if (q == 0) return p;
    return gcd(q, p%q);
   }
}

 

재귀함수 사용식

내가 쓴 while과 비슷하다

q가 0이 될때까지 p%q로 한 이후에 0이 아니라면  p와 q의 자리를 바꿔서 다시 함수 ㄱㄱ 

'Coding Test > 프로그래머스 연습' 카테고리의 다른 글

[JAVA] 콜라츠 추측  (1) 2024.09.29
[JAVA] 직사각형 별찍기  (1) 2024.09.29
[JAVA] 같은 숫자는 싫어  (0) 2024.09.27
[JAVA] 자릿수 더하기  (0) 2024.09.27
[SQL] 과일로 만든 아이스크림 고르기  (0) 2024.09.27