728x90

개념

A와 B의 최대공약수를 구하는 알고리즘 중 하나이다. 요약하면 아래와 같다.

 

1. A를 B로 나눈 나머지를 구하여 R이라 한다.

2-1. 만약 R(나머지)이 0이라면 A와 B의 최대공약수는 B이다.

2-2. 아니라면 B를 R로 나눈 나머지를 구하고, 나머지가 0이 될 때까지 위 과정을 반복한다.

 

예시 코드

두 가지 방법으로 구현해 보았는데, 재귀함수를 이용하는 것이 조금 더 직관적인 것  같다.

코드를 실행하고, 두 수를 공백을 두고 입력하면 된다.(ex : 30 20 --> 10 출력)

 

1. 반복문(while)을 이용한 알고리즘

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int A = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());

        int result = getG(A, B);
        System.out.println(result);
    }
    public static int getG(int A, int B) {
        while(B != 0) {
            int R = A % B; // 1. A를 B로 나눈 나머지를 구하여 R이라 한다.

            A = B;
            B = R; // R == 0이면 반복문이 끝난다.
        }
        return A; // 반복문이 끝날 시점의 나누는 수였던 B를 리턴한다.(23째줄에서 A에 B를 대입함)
    }
}

2. 재귀함수를 이용한 알고리즘

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st;

        st = new StringTokenizer(br.readLine());
        int A = Integer.parseInt(st.nextToken());
        int B = Integer.parseInt(st.nextToken());

        int result = getG(A, B);
        System.out.println(result);
    }
    public static int getG(int A, int B) {
        int R = A % B; // 1. A를 B로 나눈 나머지를 구하여 R이라 한다.

        if(R == 0) return B; // 2-1. 만약 R(나머지)이 0이라면 A와 B의 최대공약수는 B이다.
        else return getG(B, R); // 2-2. 아니라면 B를 R로 나눈 나머지를 구하고, 나머지가 0이 될 때까지 위 과정을 반복한다.
    }
}

틀린 부분이 있다면 정정해주시면 감사하겠습니다.

제가 이해한 내용을 간단히 요약하여 기록해 두고, 기억이 나지 않을 때마다 찾아보려는 목적으로 작성하는 글입니다.

따라서 설명이 부족할 수 있으니 양해 부탁드리고, 궁금한 부분이 있으시면 자유롭게 댓글 남겨주세요!

 

728x90

'[JAVA]STUDY > 간단한 알고리즘' 카테고리의 다른 글

[JAVA]모듈러 연산  (4) 2022.12.30
[JAVA]동적 계획법  (0) 2022.12.26

+ Recent posts