본문 바로가기
JAVA/Programmers

JAVA 프로그래머스 [분수의 덧셈] 자바 Lv.0

by tripleup 2023. 5. 23.
728x90
반응형

[프로그래머스] 코딩테스트 연습 -> 코딩테스트 입문 -> 분수의 덧셈

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;
    }
}
728x90
반응형

댓글