Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 | 29 |
30 |
Tags
- 백준 1934 자바
- 백준 9498 자바
- 백준 10998 A*B
- 백준 1001 자바
- boj 1934
- 백준 1330 자바
- 백준 1934 최소공배수
- 백준 10430 자바
- 백준 2753 자바
- 백준 1008 자바
- 2753 자바
- 1934 java
- 백준 2588 자바
- 1934 자바
- boj 2753
- 백준 1008 A/B
- 백준 2753 윤년
- 백준 1008
- 백준 2588 곱셈
- 백준 10998
- 백준 10869 사칙연산
- 백준 1001 A-B
- 백준
- 백준 10998 자바
- 백준 1934
- 백준 1330 두 수 비교하기
- 백준 사칙연산
- 백준 10430 나머지
- 백준 9498 시험 성적
- 백준 10430
Archives
- Today
- Total
컴퓨터 하는 라따뚜이
[백준] 1934 자바 : 최소공배수 본문
[백준] 1934 자바 : 최소공배수
https://www.acmicpc.net/problem/1934
1934번: 최소공배수
두 자연수 A와 B에 대해서, A의 배수이면서 B의 배수인 자연수를 A와 B의 공배수라고 한다. 이런 공배수 중에서 가장 작은 수를 최소공배수라고 한다. 예를 들어, 6과 15의 공배수는 30, 60, 90등이 있
www.acmicpc.net
문제.
테스트 케이스 갯수를 입력받아 각각의 값에 따른 최소공배수를 출력하면 되는 문제다.
풀이.
유클리드 호제법을 사용해 최대공약수를 구하고, 이를 활용해 최소공배수를 구할 수 있도록 하자.
유클리드 호제법(-互除法, Euclidean algorithm) 또는 유클리드 알고리즘은 2개의 자연수 또는 정식(整式)의 최대공약수를 구하는 알고리즘의 하나이다. 호제법이란 말은 두 수가 서로(互) 상대방 수를 나누어(除)서 결국 원하는 수를 얻는알고리즘을 나타낸다. 2개의 자연수(또는 정식) a, b에 대해서 a를 b로 나눈 나머지를 r이라 하면(단, a>b), a와 b의 최대공약수는 b와 r의 최대공약수와 같다. 이 성질에 따라, b를 r로 나눈 나머지 r'를 구하고, 다시 r을 r'로 나눈 나머지를 구하는 과정을 반복하여 나머지가 0이 되었을 때 나누는 수가 a와 b의 최대공약수이다. 이는 명시적으로 기술된 가장 오래된 알고리즘으로서도 알려져 있으며, 기원전 300년경에 쓰인 《원론》 제7권, 명제 1부터 3까지에 해당한다.
출처 : 위키백과
역시나 개념은 어렵다...
쉽게 설명하면 두 정수 N, M 이 주어졌을 때 나머지가 0이 될 때 까지 N을 M으로 나눠서 나머지를 구하고 N과 M값을 각각 M, N%M 으로 바꿔주면 된다. 이 때 N값이 최대공약수가 된다.
이를 간단히 코드로 짜보면 아래와 같다.
public int gcd(int n, int m) {
int temp;
do {
temp = n % m;
n = m;
m = temp;
} while(temp != 0);
return n;
}
이렇게 최대공약수(GCD)를 구했다면 최소공배수(LCM)을 구하는건 어렵지 않다.
두 수 M, N을 곱하고 이를 최대공약수(GCD)로 나누어 주면 끝이다.
소인수분해보다 속도가 더 빠르다고 하니 가급적 유클리드 호제법을 사용하도록 하자!
코드.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n, m, T;
T = sc.nextInt();
for(int i = 0; i < T; i++) {
n = sc.nextInt();
m = sc.nextInt();
int gcd = gcd(n, m);
int lcm = n * m / gcd;
System.out.println(lcm);
}
}
// 최대 공약수 (유클리드 호제법)
public static int gcd(int n, int m) {
int temp;
do {
temp = n % m;
n = m;
m = temp;
} while(temp != 0);
return n;
}
}
난이도 : ◐○○○○○○○○○
지극히 주관적인 생각