반응형
백준 1850번 문제 - 최대공약수
1850번: 최대공약수
모든 자리가 1로만 이루어져있는 두 자연수 A와 B가 주어진다. 이때, A와 B의 최대 공약수를 구하는 프로그램을 작성하시오. 예를 들어, A가 111이고, B가 1111인 경우에 A와 B의 최대공약수는 1이고, A
www.acmicpc.net
문제 분석
- 두 자연수의 1의 개수를 입력 받아, 최대 공약수를 출력해라.
해결 키 포인트
- 유클리드 호제법을 이용해 최대 공약수를 구한다
- 두 수의 1의 개수를 가지고, 최대 공약수의 1의 개수를 알아낸다
- 해당 수 만큼 1을 출력
- 처음 시도, sum = sum * 10 + 1 로 구현하였지만 문제 존재
- 결국엔, bw.write("1")로 구현하여 성공
유클리드 호제법
MOD연산을 이용해 두 수의 최대 공약수를 구하는 알고리즘이다.
MOD 연산 : 두 값을 나눈 나머지를 구하는 연산
ex. 10 MOD 4 = 2 (10 % 4 = 2)
유클리드 호제법 알고리즘
1. 큰 수를 작은 수로 나누는 MOD 연산 수행
2. 앞 단계에서의 작은 수와 MOD 연산 결과 값(나머지)으로 MOD 연산 수행
3. 나머지가 0이 되는 순간의 작은 수를 최대 공약수로 선택
코드
import java.io.*;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
// 두 수의 1의 개수 입력
StringTokenizer st = new StringTokenizer(br.readLine());
long A = Long.parseLong(st.nextToken());
long B = Long.parseLong(st.nextToken());
// 최소 공약수의 1의 개수 구하기
long sum = (A >= B) ? A % B : B % A;
long gcd = Math.min(A, B);
while (sum > 0) {
long temp = sum;
sum = gcd % sum;
gcd = temp;
}
// 실제 최대 공약수 제작
for(int i=0;i<gcd;i++) {
bw.write("1");
}
bw.flush();
bw.close();
}
}
반응형
'CodingTEST' 카테고리의 다른 글
[백준 18352] 특정 거리의 도시 찾기 (JAVA) (0) | 2023.08.21 |
---|---|
[백준 1033] 칵테일 (JAVA) (0) | 2023.08.17 |
[백준 1934] 최소공배수 (JAVA) (0) | 2023.08.17 |
[백준 11689] GCD(n, k) = 1 (JAVA) (0) | 2023.08.15 |
[백준 1016] 제곱 ㄴㄴ 수 (JAVA) (0) | 2023.08.13 |