출처: 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;
}
}