LeeTaes 공부노트

[프로그래머스/C++ 문제 풀이] Lv. 0 - 분수의 덧셈 본문

코딩테스트/프로그래머스 (Lv. 0)

[프로그래머스/C++ 문제 풀이] Lv. 0 - 분수의 덧셈

리태s 2024. 6. 21. 19:22
728x90
반응형

문제 설명

첫 번째 분수의 분자와 분모를 뜻하는 numer1, denom1, 두 번째 분수의 분자와 분모를 뜻하는 numer2, denom2가 매개변수로 주어집니다. 두 분수를 더한 값을 기약 분수로 나타냈을 때 분자와 분모를 순서대로 담은 배열을 return 하도록 solution 함수를 완성해보세요.

 

제한 사항

  • 0 <numer1, denom1, numer2, denom2 < 1,000

입출력 예

numer1 demon1 numer2 denom2 result
9 2 1 3 [29, 6]
1 2 3 4 [5, 4]

 

입출력 예 #1

  • 1 / 2 + 3 / 4 = 5 / 4입니다. 따라서 [5, 4]를 return 합니다.

입출력 예 #2

  • 9 / 2 + 1 / 3 = 29 / 6입니다. 따라서 [29, 6]을 return 합니다.

문제 풀이

이번 문제는 분수를 덧셈하고 기약 분수로 만드는 문제입니다.

> 기약 분수 : 분자와 분모가 1이 아닌 다른 수로 나눠지지 않는 분수

 

즉, 분모를 일치시키고 덧셈 연산을 수행한 이후 둘의 최대 공약수로 나눠주면 해결되는 간단한 문제입니다.

but.. 저는 기약 분수라는 글을 읽지 못했고, 2차례 오답 처리를 받았습니다.

 

정답 코드

더보기
#include <string>
#include <vector>

using namespace std;

vector<int> solution(int numer1, int denom1, int numer2, int denom2) {
    vector<int> answer;
    
    int i = 0;
    
    int mult1 = -1;
    int mult2 = -1;
    
    // denom(분모) 숫자 일치시키기
    while (true)
    {
        i++;
        // 둘 다 해당 숫자로 나눠진다면?
        if (i % denom1 == 0 && i % denom2 == 0)
        {
            // 분모가 일치한 것이므로 해당 몫만큼 분모와 분자에 곱할 계수를 지정합니다.
            mult1 = i / denom1;
            mult2 = i / denom2;
            
            // 반복문을 즉시 종료합니다.
            break;
        }
    }
        
    // 값을 더해줍니다.
    int nu = numer1 * mult1 + numer2 * mult2;
    int de = denom1 * mult1;
        
    int mn = -1;
        
    // 최대 공약수를 찾습니다.
    for (int i = 1; i <= de; i++)
    {
        if (nu % i == 0 && de % i == 0)
        {
            mn = i;
        }
    }

    // 만약 최대 공약수가 존재한다면?
    if (mn)
    {
        // 최대 공약수로 나눠줍니다.
        nu /= mn;
        de /= mn;
    }

    // 값을 추가합니다.
    answer.push_back(nu);
    answer.push_back(de);
    
    return answer;
}

 

728x90
반응형