문제 설명
https://school.programmers.co.kr/learn/courses/30/lessons/120808
제한 사항
입출력 예
풀이
import java.util.HashSet;
import java.util.ArrayList;
import java.util.Collections;
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
ArrayList<HashSet<Integer>> numSetList = new ArrayList<>();
int[] num = new int[] { denom1, denom2 };
int max, min, numer3;
for (int i = 0; i < 2; i++) numSetList.add(getDivisor(num[i]));
numSetList.get(0).retainAll(numSetList.get(1));
max = Collections.max(numSetList.get(0));
min = num[0] * num[1] / max;
numer1 *= min / num[0];
numer2 *= min / num[1];
numer3 = numer1 + numer2;
numSetList.add(getDivisor(numer3));
numSetList.add(getDivisor(min));
numSetList.get(2).retainAll(numSetList.get(3));
max = Collections.max(numSetList.get(2));
return new int[] { numer3 / max, min / max };
}
public static HashSet<Integer> getDivisor(int num) {
HashSet<Integer> result = new HashSet<>();
for (int i = 1; i <= Math.sqrt(num); i++) {
if (num % i == 0) {
result.add(i);
result.add(num / i);
}
}
return result;
}
}
후기
너무 깊이 생각해서 코드가 길어졌다... 두 수의 최소 공배수만큼 되도록 곱했는데 그냥 단순하게 두 수의 곱으로 하면 이렇게 길지 않게 풀 수 있다. 그리고 무슨 유클리드 호제법이라는 게 있다는데 나중에 시간 나면 찾아봐야겠다.
'코딩테스트 (프로그래머스) > Java' 카테고리의 다른 글
[프로그래머스][JAVA][Lv. 2] 캐시 (0) | 2023.09.05 |
---|---|
[프로그래머스][JAVA][Lv. 2] 할인 행사 (0) | 2023.09.04 |
[프로그래머스][JAVA][Lv. 0] 연속된 두 수의 합 (0) | 2023.09.02 |
[프로그래머스][JAVA][Lv. 0] 안전지대 (0) | 2023.08.31 |
[프로그래머스][JAVA][Lv. 2] N개의 최소공배수 (0) | 2023.08.31 |