프로그래머스 - 분수의 덧셈(Java)

윤민선·2026년 9월 14일

프로그래머스

목록 보기
82/98
post-thumbnail

문제 설명

두 분수 numer1 / denom1과 numer2 / denom2가 주어질 때, 두 분수를 더한 값을 기약분수로 만들어 반환하는 문제이다.


접근 방법

  1. 두 분수를 통분한다.
  2. 분자와 분모의 최대공약수를 찾는다.
  3. 분자와 분모를 최대공약수로 나누어 약분한다.
  4. 결과를 배열에 담아 반환한다.

풀이 순서

1. 분수 더하기

두 분수를 통분하면,

int numer = numer1 * denom2 + numer2 * denom1;
int denom = denom1 * denom2;

가 된다.

분자 = numer1 × denom2 + numer2 × denom1
분모 = denom1 × denom2

2. 최대공약수 찾기

for (int i = 1; i <= denom && i <= numer; i++) {
    if (numer % i == 0 && denom % i == 0) {
        max = i;
    }
}

numer와 denom을 모두 나눌 수 있는 숫자를 찾고, 가장 큰 값을 max에 저장한다.

i가 증가하면서 조건을 만족할 때마다 max를 갱신하기 때문에 마지막에 저장된 값이 최대공약수가 된다.


3. 약분하기

numer = numer / max;
denom = denom / max;

분자와 분모를 최대공약수로 나누어 기약분수로 만든다.


최종 코드

class Solution {
    public int[] solution(int numer1, int denom1, int numer2, int denom2) {

        int[] answer = {};
        int max = 0;

        // 두 분수를 통분하여 더한다
        int numer = numer1 * denom2 + numer2 * denom1;
        int denom = denom1 * denom2;

        // 분자와 분모의 최대공약수 구하기
        for (int i = 1; i <= denom && i <= numer; i++) {
            if (numer % i == 0 && denom % i == 0) {
                max = i;
            }
        }

        // 최대공약수로 약분
        numer = numer / max;
        denom = denom / max;

        answer = new int[]{numer, denom};

        return answer;
    }
}

실행 결과

0개의 댓글