ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 2609,1934 - 최대공약수와 최소공배수,최소공배수
    자료구조와 알고리즘/문제풀기 2023. 4. 10. 18:36

    두 개의 자연수를 입력받아 최대 공약수와 최소 공배수 출력하는 것

    2609 최대공약수 최소공배수 

    public class Main{
        
        public static void main(String[] args) throws Exception{
            
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            String[] input =br.readLine().split(" ");
            int a = Integer.parseInt(input[0]);
            int b = Integer.parseInt((input[1]));
            
            int gcd = getGcd(a,b);
            int lcm = (a*b)/getGcd2(a,b);
            bw.write(gcd+"\n"+lcm+"\n");
            bw.flush();
            bw.close();
            
        }
         public static int getGcd(int a,int b){
            if(b==0){
                return a;
            }else {
                return getGcd(b, a % b);
            }
        }
         public static int getGcd2(int a, int b){
           while( b != 0){
               int r= a % b;
               a = b;
               b = r;
           }
            return a;
        }
    }

    1934 최소공배수

    public class Main{
        public static void main(String[] args) throws Exception {
            BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
            BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
            int t = Integer.parseInt(br.readLine());
            String input;
            int a;
            int b;
    
            while(t-->0) {
                input = br.readLine();
                a = Integer.parseInt(input.substring(0,input.indexOf(" ")));
                b = Integer.parseInt(input.substring(input.indexOf(" ")+1));
    
                int lcm = (a * b) / getGcd(a, b);
                bw.write( lcm + "\n");
            }
            bw.flush();
            bw.close();
    
            
        }
        public static int getGcd(int a, int b){
            if(b == 0)return a;
            else return getGcd(b,a%b);
        }
    }

    최대공약수- GCD

    두 수의 최대공약수 구하는 가장 쉬운 방법은 

    2부터 a와 b중 작은 수까지의 수로 나누어보는 것이다.

     

    for(int i=2; i<Math.min(a,b);i++){
    if(a%i==0 && b %i ==0}(maxgcd =i;}
    }

    시간 복잡도 O(N)으로 구리다. 

     

    -유클리드 호제법 (O(logN))

     

    a와 b를 나눈 나머지를 m이라고 하면, 

    a와 b의 최대 공약수는 b와 m의 최대공약수와 같다.

    gcd(a,b) = gcd(b, a%b) ----> m이 0일때가 최대공약수이다.

     

    -세 수의 최대공약수는 gcd(a,b,c) = gcd(gcd(a,b),c) -->ab의 최대공약수와 c 사이의 최대공약수 

    N개의 최대공약수로 확장가능 gcd(gcd(gcd(a,b),c),d)

     

    최소공배수 (LCM)

     

    a*b = 최대공약수 *최소공배수이므로 a*b/최대공약수는 최소공배수이다.

     

    //재귀호출
    public int getGCD(int a, int b)
    {	if(b == 0) return a;
    	else return getGCD(b,a%b);
    }
    
    //반복문
    pulbic int getGCD(int a, int b){
    	while(b != 0){
        int r = a%b;
        a=b;
        b=r;
        }
    }

     

    '자료구조와 알고리즘 > 문제풀기' 카테고리의 다른 글

    백준 1929번 - 소수 구하기  (0) 2023.04.10
    백준 1978 - 소수 찾기  (0) 2023.04.10
    백준 10430 - 나머지  (0) 2023.04.10
    백준 10799 - 쇠막대기  (0) 2023.04.05
    백준 17413 - 단어뒤집기2  (0) 2023.04.05
Designed by Tistory.