[프로그래머스] 코딩테스트 연습 -> 코딩테스트 입문 -> 분수의 덧셈
https://school.programmers.co.kr/learn/courses/30/lessons/120808
해결 과정
모두가 알 듯, 분수의 덧셈은 통분을 통해 이루어진다.
두 분수의 분모를 똑같이 맞춘 후 그에 알맞게 분자에 곱해주면 된다.
최소공배수를 고려하지 않고 일단 통분을 해보면 공통 분모는 denom1 * denom2 가 된다.
분자는 각각 numer1*denom2, numer2*denom1 이다.
우리는 이 두 분수를 더할 것이기 때문에 더하게 되면,
분모는 denom1 * denom2이고, 분자는 numer1*denom2 + numer2*denom1 이 된다.
우리는 조건에 따라 기약분수로 나타내야 하기 때문에 연산이 편하도록 새로운 변수로 지정해주면,
int denom = denom1*denom2;
int numer = numer1*denom2 + numer2*denom1;
이제 denom과 numer의 최대공약수를 찾아 각각을 나눠주면 기약분수로 나타낼 수 있게 된다.
denom과 numer의 최대공약수를 찾기 위해 두 숫자에 동시에 나누어떨어질 수 있는 어떠한 i를 찾는다.
여기서 for 문을 이용하여 denom을 i로 나누었을 때 나머지가 0이고, 동시에 numer을 i로 나누었을 때 나머지가 0인 i를 찾으면 된다. 여기서 반복범위에 집중해야 하는데, 분모와 분자 둘 중 어떤 것이 더 클 지 모르기 때문에
반복문 안에서 i는 1부터 i<=numer && i<=denom 까지 1씩 증가해가며 반복하도록 한다.
그렇게 되면 공약수를 max에 계속 저장하면서, 결국 최대공약수가 마지막으로 저장되게 된다.
그 max로 denom 과 numer을 나눠준다. 나눠진 수를 answer 배열로 생성하고 answer을 return하면 해결 끝
*여기서 주의할 점은 배열에 numer과 denom을 넣기 전 numer과 denom의 연산이 마무리 되어야 한다.
(배열을 미리 선언하여 크기만 할당해도 되고, 나처럼 맨 아래에 배열 선언과 초기화를 같이 해도 된다.)
소스 코드
class Solution {
public int[] solution(int numer1, int denom1, int numer2, int denom2) {
int numer = numer1*denom2 + numer2*denom1;
int denom = denom1*denom2;
int max = 1;
for (int i =1; i<=numer && i<=denom; i++) {
if (denom%i == 0 && numer%i == 0 ) {
max = i;
}
}
numer = numer/max;
denom = denom/max;
int[] answer = {numer, denom};
return answer;
}
}
'JAVA > Programmers' 카테고리의 다른 글
JAVA 프로그래머스 [숫자 비교하기] 자바 Lv.0 (0) | 2023.05.23 |
---|---|
JAVA 프로그래머스 [배열 두 배 만들기] 자바 Lv.0 (0) | 2023.05.23 |
JAVA 프로그래머스 [두 수의 나눗셈] 자바 Lv.0 (0) | 2023.05.23 |
JAVA 프로그래머스 [두 수의 곱] 자바 Lv.0 (0) | 2023.05.22 |
JAVA 프로그래머스 [몫 구하기] 자바 Lv.0 (0) | 2023.05.22 |
댓글