코딩테스트/백준

[백준 1850] 최대공약수 (Java) - 유클리드 호제법, 최대공약수

imachill7guy 2025. 3. 10. 21:47

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

 

최대공약수

문제

모든 자리가 1로만 이루어져있는 두 자연수 A와 B가 주어진다. 이때, A와 B의 최대 공약수를 구하는 프로그램을 작성하시오.

예를 들어, A가 111이고, B가 1111인 경우에 A와 B의 최대공약수는 1이고, A가 111이고, B가 111111인 경우에는 최대공약수가 111이다.

입력

첫째 줄에 두 자연수 A와 B를 이루는 1의 개수가 주어진다. 입력되는 수는 263보다 작은 자연수이다.

출력

첫째 줄에 A와 B의 최대공약수를 출력한다. 정답은 천만 자리를 넘지 않는다.

 

예제 입력 3 복사

500000000000000000 500000000000000002

예제 출력 3 복사

11

 

import java.io.*;
import java.util.StringTokenizer;

public class Main {
    static long A;
    static long B;
    public static void main (String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

        A = Long.parseLong(st.nextToken());
        B = Long.parseLong(st.nextToken());

        long gcd = GCD(A,B);
        for(int i=0; i<gcd; i++){
            bw.write("1");
        }
        
        bw.flush();
        bw.close();

    }
    private static long GCD(long A, long B){
        if (B == 0){
            return A;
        }else{
            return GCD(B, A%B);
        }
    }
}
  • 입력값이 int형을 벗어날 수 있으므로 Long형으로 입력값을 받아준다.
  • 유클리드 호제법으로 최대공약수를 구한다.
  • 최대공약수 구하는 법
    • A와 B 나머지 연산을 수행한다.
    • 나머지 연산 후 나머지값이 0이 아니라면
    • GCD(B, A%B) 재귀호출한다.
    • 매개변수 long B가 0이 되는 순간이 오면 A(최대공약수)를 return 한다. 
  • 하지만 관건은 최대공약수 만큼 1을 출력해줘야한다.
  • 그냥 for문으로 gcd값 만큼 반복출력하면 시간초과가 발생한다.
  • 따라서 BufferedWriter를 사용해주도록한다.