ProblemSolving/Programmers

[Programmers] 코딩테스트 입문 100 | 분수의 덧셈(Q007)

JOKUN 2023. 2. 7. 19:28

 

분수의 덧셈

// 분수의 덧셈
// 문제 설명
// 첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 
// 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.
// 제한사항
// 0 <numer1, denom1, numer2, denom2 < 1,000
  
class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {
        int[] answer = new int[2];
        
        //분자
        answer[0] = numer1 * denom2 + numer2 * denom1;
        //분모
        answer[1] = denom1 * denom2;
        
        //최대 공약수 구하기 
        int min = Math.min(answer[0], answer[1]);
        int max = 0;
        
        // min만큼 반복문을 돌며 가장 큰 값으로 나누어 떨어지는 것이 최대 공약수가 됨
        for(int i = 1; i <= min; i++){
            if(answer[0]%i == 0 && answer[1]%i == 0){
                max = i;
            }
        }
        
        // 각 분모 분자를 최대 공약수로 나눠줘서 기약분수 만들기
        answer[0] /= max;
        answer[1] /= max;
        return answer;
    }
}

 

https://github.com/joanna930224/Programmers/tree/master/src/introduction100

 

GitHub - joanna930224/Programmers: Programmers 문제 풀이 저장소

Programmers 문제 풀이 저장소. Contribute to joanna930224/Programmers development by creating an account on GitHub.

github.com

 

아주 쉬운 사칙연산끝나고 이제 좀.. 문제같은 문제풀이로 분수 덧셈 후 기약분수를 배열로 반환하는 문제가 나왔다.
이걸 처음에 풀려고했을 때 그냥 분수 계산법 따라서 분수 덧셈하는 거 먼저 만들었다.
분모1 * 분모2 곱해주고 분자1 * 분모2, 분자2 * 분모1 각각 구해서 더하면서.. 
이렇게 풀다가 뭔가 이상함을 감지했음 
그래서 기약 분수를 어떻게 만들건데..??! 여기서 걸리는 것.

아직 많은 문제를 풀어보지 않았지만 백준 문제 풀때도 느꼈던 건데
문제를 코드로 직접 푸는 형태로 생각해서 접근하다보면 
코드가 뭔가 복잡하고 지저분하고 이상해진다..

분수의 덧셈.. 기약분수.. 최대공약수.. 최소공배수..
초등학생때 배운건데.. 너무 옛날이잖아.. 😶‍🌫️
푸는 법이야 숫자가 주어지면 답이야 구할 수 있지만
결국엔 어떠한 알고리즘을 통해 답을 찾도록 해주어야할까?가 관건이다. 

기약분수 분자 분모를 배열로 리턴해야하니
우선은 분수를 더한 값으로 지정을 해주었다.
그러고 기약분수로 만들어야하는데 기약분수로 만드려면
분자,분모의 최대공약수를 알아야하는 것! 
그렇다면 최대 공약수를 구하는 법을 작성한 후에
더해놨던 분자 분모 값을 최대 공약수로 나누어 주면 된다.

다른 사람들 풀이법도 꼭 참고해서 다른 사람들은 어떤 방법으로 풀었는지 보는것도 굉장히 중요하다.
결국 이런 훈련을 해야 다른 문제에서도 확장된 사고를 가지고 문제를 풀 수 있는 듯 하다.
이제 겨우 입문 문제중 7번째 문제인데 바로바로 풀리지가 않는... ㅎㅎ 갈길이 멀다.