Notice
Recent Posts
Recent Comments
Link
DY N DY
실력키우기 최대공약수, 최소공배수(JAVA) 본문
1002 : 최대공약수, 최소공배수
제한시간: 1ms 메모리제한: 64MB
해결횟수: 1226회 시도횟수: 3876회
n개의 정수를 입력받아서 최대공약수와 최소공배수를 구하는 프로그램을 작성하여 보자.
[Copy]3 2 8 10 | [Copy]2 40 |
- /**************************************************************
- Problem: 1002
- User: a132034
- Language: Java
- Result: Success
- Time:158 ms
- Memory:9308 kb
- ****************************************************************/
- import java.util.Arrays;
- import java.util.Scanner;
- public class Main{
- public static void main(String[] args) {
- int N = sc.nextInt();
- int[] arr = new int[N];
- int GCD = 0, LCM = 0 ;
- for(int i = 0 ; i < N; ++i)
- arr[i] = sc.nextInt();
- GCD = arr[N-1];
- LCM = arr[N-1];
- for(int i = N-2 ; i >= 0; --i)
- {
- int x, y;
- if(GCD > arr[i]){
- x = GCD; y = arr[i];
- }
- else{
- y = GCD; x = arr[i];
- }
- GCD = getGcd(x, y);
- if(LCM > arr[i]){
- x = LCM; y = arr[i];
- }
- else{
- y = LCM; x = arr[i];
- }
- LCM = (x * y) / getGcd(x, y);
- }
- }
- public static int getGcd(int x, int y)
- {
- if(x % y == 0) return y;
- return getGcd(y, x%y);
- }
- }
기존의 최대공약수, 최소공배수를 활용하지만 이번에는 두 수간의 문제가 아닌 여러 수의 최대공약수와 최소공배수를 구하는 문제였다.
사실 도움말을 읽어보면.. 어렵지 않다.
크게 어려울 것이 없다.
맨 위의 규칙을 이용한다면 ( A B의 최대공약수가 D일 때 -> A B C의 최대공약수는 D C의 최대공약수와 같다 )
두 수간의 최대공약수, 최소공배수를 구한 후 -> 구해진 최대공약수, 최소공배수와 다음 수의 최대공약수, 최소공배수를 구하면 된다.
이때, 코드에서 주의했던 점은.. 최대공약수(gcd)를 구하는 함수에서 x가 y보다 커야 할 것.
이때문에 for loop를 사용했고, 정렬도 한 후에 구하기 시작했는데.. 아래에서 조건으로 큰 수를 x에 넣어줌으로써.. 사실상 loop와 정렬은 필요가 없다.
아니라면 아에 함수 내에 x, y의 크기를 비교하여준다면 더 편했을 것 같기도 하다.
'PARK > ALGORITHM' 카테고리의 다른 글
실력키우기 소수(JAVA) (0) | 2016.06.01 |
---|---|
알고리즘 로봇(JAVA) (0) | 2016.05.26 |
알고리즘 치즈(JAVA) (1) | 2016.05.24 |
실력키우기 삽입정렬 횟수 세기(C++) (0) | 2016.05.23 |
실력키우기 삽입정렬(C++) (0) | 2016.05.23 |