프로그래머스 분수의 덧셈 JAVA 풀이 (수학, 구현, 유클리드 호제법)

2026. 6. 30. 23:44·코테(Solved.ac + Programmers)
728x90

🔗 문제 링크

 

프로그래머스

SW개발자를 위한 평가, 교육의 Total Solution을 제공하는 개발자 성장을 위한 베이스캠프

programmers.co.kr


📌 문제 개요

두 개의 분수가 주어질 때, 두 분수를 더한 뒤 기약분수 형태로 반환하는 문제입니다.

분수를 더하기 위해서는 먼저 통분을 해야 하며, 계산된 결과를 최대공약수(GCD) 로 나누어 기약분수로 만들어야 합니다.

예를 들어,

  • 1/2 + 3/4 = 5/4
  • 9/2 + 1/3 = 29/6

📌 접근 방법

분수의 덧셈은 먼저 분모를 같게 만들어야 합니다.

두 분모를 곱하여 공통 분모를 만들고, 새로운 분자는 다음과 같이 계산합니다.

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

이후 계산된 분자와 분모의 최대공약수(GCD) 를 구한 뒤 각각 나누면 기약분수가 완성됩니다.

최대공약수는 유클리드 호제법을 사용하면 매우 빠르게 구할 수 있습니다.


📌 핵심 아이디어

1. 분수를 통분한다.

분모를 서로 곱하여 공통 분모를 만들고 새로운 분자를 계산합니다.

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

예를 들어,

1/2 + 3/4

= (1×4 + 3×2) / (2×4)
= 10 / 8

2. 최대공약수(GCD)를 구한다.

기약분수로 만들기 위해 최대공약수를 구합니다.

유클리드 호제법 반복하여 나머지가 0이 될 때의 값을 반환합니다.

GCD(a, b) → GCD(b, a % b)
static int gcd(int a, int b) {
    while (b != 0) {
        int temp = a % b;
        a = b;
        b = temp;
    }
    return a;
}
GCD(10, 8)

10 % 8 = 2
8 % 2 = 0

→ 최대공약수 = 2
 

3. 기약분수로 만든다.

최대공약수로 분자와 분모를 각각 나누면 됩니다.

int gcd = gcd(numer, denom);

int[] answer = {
    numer / gcd,
    denom / gcd
};
10 / 8

GCD = 2

↓

5 / 4

최종 결과는 [5, 4]가 됩니다.


📌 전체 코드

import java.util.Arrays;

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

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

        int gcd = gcd(numer, denom);

        return new int[]{numer / gcd, denom / gcd};
    }

    static int gcd(int a, int b) {
        while (b != 0) {
            int temp = a % b;
            a = b;
            b = temp;
        }
        return a;
    }
}
 

📄 정리

  • 분수의 덧셈은 먼저 통분을 수행한다.
  • 새로운 분자는 numer1 × denom2 + numer2 × denom1으로 계산한다.
  • 계산된 분자와 분모를 최대공약수(GCD) 로 나누면 기약분수가 된다.
  • 최대공약수는 유클리드 호제법을 사용하면 효율적으로 구할 수 있다.
  • 분수 계산과 최대공약수 알고리즘을 함께 연습하기 좋은 구현 문제였다.
728x90

'코테(Solved.ac + Programmers)' 카테고리의 다른 글

프로그래머스 체육복 JAVA 풀이 (그리디, 구현)  (0) 2026.07.02
프로그래머스 완주하지 못한 선수 JAVA 풀이 (HashMap, 해시)  (0) 2026.07.01
프로그래머스 로또의 최고 순위와 최저 순위 JAVA 풀이 (완전탐색, 구현)  (0) 2026.06.29
프로그래머스 동영상 재생기 JAVA 풀이 (구현, 시뮬레이션)  (0) 2026.06.28
프로그래머스 햄버거 만들기 JAVA 풀이 (스택, 구현)  (0) 2026.06.27
'코테(Solved.ac + Programmers)' 카테고리의 다른 글
  • 프로그래머스 체육복 JAVA 풀이 (그리디, 구현)
  • 프로그래머스 완주하지 못한 선수 JAVA 풀이 (HashMap, 해시)
  • 프로그래머스 로또의 최고 순위와 최저 순위 JAVA 풀이 (완전탐색, 구현)
  • 프로그래머스 동영상 재생기 JAVA 풀이 (구현, 시뮬레이션)
PUSH → MERGE → DEPLOY
PUSH → MERGE → DEPLOY
데이터 흐름과 운영 자동화를 설계하는 백엔드 개발자
  • PUSH → MERGE → DEPLOY
    Coding Dongin
    PUSH → MERGE → DEPLOY
  • 전체
    오늘
    어제
    • MEUN N
      • 코테(Solved.ac + Programmers) N
      • BootCamp(JAVA)
      • JAVA
      • SpringBoot
      • JavaScript
      • JSP
      • DB(SQL)
      • React
      • HTML_CSS
      • jQuery
      • SCSS
      • GSAP
      • 설치 + 꿀팁
      • 정보처리기사 오답노트
      • 정보처리기사 기출문제
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

    • GIT
  • 공지사항

  • 인기 글

  • 태그

    정처기
    정보처리기사 실기 기출문제
    배열
    완전탐색
    알고리즘
    기출문제
    백엔드개발자
    브루트포스
    정렬
    구현
    백준
    dp
    정처기실기
    시뮬레이션
    Level2
    실기
    문자열
    solved.ac
    springboot
    프로그래머스
    수학
    코딩테스트
    정보처리기사
    자바
    자료구조
    level1
    java
    level0
    정처기오답노트
    피보나치
  • 최근 댓글

  • 최근 글

  • 250x250
  • hELLO· Designed By정상우.v4.10.4
PUSH → MERGE → DEPLOY
프로그래머스 분수의 덧셈 JAVA 풀이 (수학, 구현, 유클리드 호제법)
상단으로

티스토리툴바