[오늘의 문제] 최대공약수와 최소공배수

shlim55·2025년 6월 27일

코딩테스트

목록 보기
88/223

출처: https://school.programmers.co.kr/learn/courses/30/lessons/12940

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

제한 사항
두 수는 1이상 1000000이하의 자연수입니다.
입출력 예
n m return
3 12 [3, 12]
2 5 [1, 10]
입출력 예 설명
입출력 예 #1
위의 설명과 같습니다.

입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.

내가 작성한 코드문

import java.util.*;

class Solution {
    public int[] solution(int n, int m) {
        int[] answer = new int[2];
        // 두 수의 최대공약수와 최소공배수를 반환
        
        int max = Integer.MIN_VALUE;// 최대공약수
        int min = Integer.MAX_VALUE;// 최소공배수
        
        // 최대공약수, 최소공배수를 어떻게 구해낼지?? 나눈다면
        List<Integer> list1 = new ArrayList<>();// 공약수 담을 배열 이중에서 최댓값
       
        // 12약수 1,2,3,4,6,12 18약수 1,2,3,6,9,18 이라 해보면 1,2,3,6이 저장되어야 함 
        for(int i = 1; i <= Math.max(n, m); i++){// 최대공약수 구해보기 나누어 떨어지는 수중 제일 큰수   
            if(n % i == 0 && m % i == 0){// 각각 나누어 떨어진다면 공약수 
                list1.add(i);
            }  
        }
        
        // 12, 18 이라면 
        // 12의 배수 12, 24, 36, 48.. 18의 배수 18, 36, 54, 72..
        // 36, 72, 108.. 이렇게 저장되어야 함 36하나만 저장되게 해야 함 
        Collections.sort(list1, Collections.reverseOrder());// list1 내림차순 정렬
        // n * m / 최대 공약수 = 최소공배수라는 공식성립
        answer[0] = list1.get(0);// 최대공약수 list1 값중 최대값
        answer[1] = n * m /list1.get(0);// 최소공배수
        return answer;
    }
}

우선 Math.max(n, m)해서 둘중 최댓값 범위까지 반복문 도는 생각까지
어찌저찌 했으나

최소공배수는 어떻게 구해야할지 난감했다.

각 두수의 곱에 최대공약수를 나누면 최소공배수라는 공식이 성립된다.

다른 사람 풀이

// 문제가 개편되었습니다. 이로 인해 함수 구성이나 테스트케이스가 변경되어, 과거의 코드는 동작하지 않을 수 있습니다.
// 새로운 함수 구성을 적용하려면 [코드 초기화] 버튼을 누르세요. 단, [코드 초기화] 버튼을 누르면 작성 중인 코드는 사라집니다.
import java.util.Arrays;

class TryHelloWorld {
      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);
   }


    // 아래는 테스트로 출력해 보기 위한 코드입니다.
    public static void main(String[] args) {
        TryHelloWorld c = new TryHelloWorld();
        System.out.println(Arrays.toString(c.gcdlcm(3, 12)));
    }
}
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;
    }

}
profile
A Normal Programmer

0개의 댓글