-
[프로그래머스] 최대공약수와 최소공배수 자바 유클리드 호제법코딩테스트 2025. 4. 7. 10:15반응형
https://school.programmers.co.kr/learn/courses/30/lessons/12940
프로그래머스
SW개발자를 위한 평가, 교육, 채용까지 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프
programmers.co.kr
문제
주어진 두 수의 최대공약수와 최소공배수를 배열에 담아 반환하시오.
접근
각 수의 약수 리스트를 먼저 구한 후, 반복문으로 m의 약수 목록에 n의 약수가 존재하는지 체크하고 촌재하면 최대값을 갱신 -> 최대공약수
최소공배수는 (n * m) / 최대공약수를 활용했다.
public static int[] solution(int n, int m) { List<Integer> nFactors = getFactors(n); List<Integer> mFactors = getFactors(m); int maxFactor = 1; // 최대 공약수 int minMulti = 1; for(int x : nFactors){ boolean isExist = mFactors.contains(x); if(isExist){ maxFactor = Math.max(maxFactor, x); } } //최소공배수 공식 : (n * m) / 최대공약수 minMulti = (n * m) / maxFactor; return new int[]{maxFactor, minMulti}; } //제곱근으로 약수구하기 public static List<Integer> getFactors(int n){ List<Integer> factors = new ArrayList<>(); for(int i = 1; i <= Math.sqrt(n); i ++){ if (n % i == 0) { factors.add(i); if (i != n / i) { // 중복 제거 (예: 5x3, 3x5) factors.add(n / i); } } } Collections.sort(factors); return factors; }
발견된 문제 : 더 효율적인 방법
최대공약수를 구할 더 효율적인 방법이 있었다. 유클리드 호제법이라고 한다.
//유클리드 호제법을 이용한 최대공약수 계산 public int getGCD(int n, int m){ while ( m != 0) { int temp = n % m ; n = m; m = temp; } return n; }
개선
public static int[] solution2(int n, int m){ int gcd = getGCD(n, m); int lcm = (n * m) / gcd; return new int[]{gcd, lcm}; }
반응형'코딩테스트' 카테고리의 다른 글
[프로그래머스] 시저암호 자바 (0) 2025.04.07 [프로그래머스] 이상한 문자 만들기 자바 toUpper / toLowerCase (0) 2025.04.07 [프로그래머스] 비밀지도 이진법 (0) 2025.04.06 [프로그래머스] 다트게임 자바 리스트수정 합계 (0) 2025.04.06 [프로그래머스] 완주하지 못한 선수 자바 해시 맵 활용 (0) 2025.04.06