본문 바로가기

알고리즘

D+7 백준 2609 최대공약수와 최소공배수

백준 2609 최대공약수와 최소공배수 - 실버 5

* 손으로 최대공약수와 최소공배수를 구할때를 참고하였다.

2 24 18
3 12 9
  4 3

어렸을 적 최대공약수와 최소공배수를 구할때는 상기 표와 같이 진행했다.

1) 공통의 약수로 나누어 떨어지지 않을 때까지 나눈다. 

2) 최대공약수 : 왼편의 나누는 값의 곱 (2 * 3)

3) 최소공배수 : 왼편의 나누는 값 * 나머지의 값 (2 * 3 * 4 * 3)

이걸 코드로 진행하면 입력받은 두 수를 나누는 나머지가 0인 수를 계속 곱해간다 > 이것이 최대공약수가 된다.

끝까지 가서 나누어 떨어지지 않을때, 남은 숫자들을 다 곱한다 > 최소공배수

 

https://www.acmicpc.net/problem/2609

 

2609번: 최대공약수와 최소공배수

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.

www.acmicpc.net

 

import java.util.*;
import java.lang.*;
import java.io.*;

public class Main {
   
    public static void main(String[] args) throws IOException {
        
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int n1 = Integer.parseInt(st.nextToken());
        int n2 = Integer.parseInt(st.nextToken());
        
        int r1 = 1, r2 =1; // r1 최대공약수, r2 최소공배수
        
        int num1= n1, num2 = n2; //계산해나갈값
        //boolean flag = false;
        while(true){
            for(int i=2; i<10000 ; i++){
                if(num1%i==0 && num2%i==0){ //둘다 나머지가 0으로 나누어떨어질때
                    r1 *=i; // 최대공약수 나누는 i값을 계속 곱해간다.
                    num1 = num1/i;
                    num2 = num2/i; //수가 변한다.
                    break;
                }
                if(i==9999){ //안나누어지고 끝까지 왔으면 최소공배수 구함
                    r2 = r1*num1*num2; //최소공배수 = 최대공약수 * 남게되는 숫자 값들.
                    System.out.println(r1);
                    System.out.println(r2);
                    return;
                    //flag = true;
                }
            }
        }
        
    
    }//main method end
}//class end

'알고리즘' 카테고리의 다른 글

D+7 백준 1978 소수찾기  (0) 2021.10.12
D+7 백준 2693 N번째 큰 수  (0) 2021.10.12
D+6 백준 - 2309 일곱난쟁이  (0) 2021.10.12
D+6  (0) 2021.10.12
D+5  (0) 2021.10.07