첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
그냥 단순히 계산만 하면 큰 문제 없겠지만, 그 값을 기약 분수로 나타내야 한다. 그러면 두 수의 최대 공약수를 알아야 한다.
코드
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int[] set1 = div(numer1, denom1);
int[] set2 = div(numer2, denom2);
numer1 = set1[0];
denom1 = set1[1];
numer2 = set2[0];
denom2 = set2[1];
int numer = numer1*denom2 + numer2*denom1;
int denom = denom1*denom2;
int[] answer = div(numer, denom);
return answer;
}
public static int[] div(int numer, int denom){
if(numer >= denom){
for(int i = denom; i >=2; i--){
if(denom%i == 0 && numer%i == 0){
numer /= i;
denom /= i;
break;
}
}
} else {
for(int i = numer; i >=2; i--){
if(denom%i == 0 && numer%i == 0){
numer /= i;
denom /= i;
break;
}
}
}
int[] result = {numer, denom};
return result;
}
}
필자는 그래서 두 값을 인자로 전달하면, 그 서로소의 값으로 return 해주는 method를 하나 만들었다. 로직은 간단하다. 두 값을 전달했을 때, 그 두 값 중에 작은 값을 기준으로 index를 1씩 감소시키면서 for loop를 만들어준다. 이때 for loop 안에서는 각 값을 index로 나누었을 때 나누어 떨어지는 경우에 해당 index로 나눈 몫을 각각 구해서 break 하여, 두 값을 return 하도록 한 것이다.
필자는 처음에 수학처럼 2부터 나누는 방식을 생각했는데, 역시나 2가 여러 차례 중복된다든지 하는 경우에는 문제를 해결할 수 없음을 인지했다. 또한 break를 걸지 않았을 때 기존 분자와 분모 값 자체는 변하지 않아서, 혹시라도 또다른 index에 해당되는 경우 연산이 한 번 더 진행되어 [0, 0]을 return 하게 되는 문제가 발생한다.
For loop에서의 loop 시작을 거꾸로 생각해보는 것이 핵심이다.
Footnote
'코딩테스트 공부 > 프로그래머스' 카테고리의 다른 글
[Coding Test : Java] Lv.0 : 문자열 뒤집기 (0) | 2023.03.16 |
---|---|
[Coding Test : Java] Lv.0 : 최빈값 구하기 (0) | 2023.03.16 |
[Coding Test : Java] Lv.0 : 중앙값 (0) | 2023.03.15 |
[Coding Test : Java] Lv.0 : 배열 두 배 만들기 (0) | 2023.03.15 |
[Coding Test : Java] Lv.0 : 두 수의 나눗셈 (0) | 2023.03.14 |
댓글