문제

두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.

출력

첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.


 

package deffender_study;
import java.util.*;

public class Main{
	public static void main(String args[]){
		Scanner scan=new Scanner(System.in);
		int a,b;
		System.out.print("두 자연수 입력하라: ");
		a = scan.nextInt();
		b = scan.nextInt();
		
		int max; //두 수 중 더 큰 값을 찾기
		if(a>b) { max = a; }
		else { max = b; }
		
		int gcd = 0;
		for(int i=1; i<= max/2; i++) {
			if(a%i == 0 && b%i == 0) {
				gcd = i;
			}
		}
		int lcm = a*b/gcd;
		System.out.println("최대공약수는 " + gcd);
		System.out.println("최소공배수는 " + lcm);
	}
}	

이거는 비교적 쉽게 풀린 문제라고 생각하는데...

제출시간이 4분이나 지났는데 결과가 아직도 안뜨는 거 보면 별로 효율적이진 못한 코드인건가///

 헉 틀렸다.. 답은 나오긴 하는데 잘못된 코드인건가

 


package deffender_study;
import java.util.*;

public class Main{


	public static void main(String args[]){
		Scanner scan=new Scanner(System.in);
		int a,b;
		System.out.print("두 자연수 입력하라: ");
		a = scan.nextInt();
		b = scan.nextInt();
		
		int max, min; //큰 수와 작은 수를 분류하기
		if(a>b) { max = a; min = b;}
		else { max = b; min = a;}
		
		int g; //최대공약수
		int tmp;
		while(true) {
			if(max % min == 0) {
				g = min;
				break;
			}
			else {
				tmp=max%min;
				max=min;
				min=tmp;
			}
		}
		
		int l = a*b/g; //최소공배수
		System.out.println("최대공약수는 " + g);
		System.out.println("최소공배수는 " + l);
	}
}	

유클리드 호제법에 대해서 공부한 뒤 코드를 짜봤다. 맞았습니다!! 너무 뿌듯한 말...

이 코드가 왜 수학으로 분류됐는지 이제 알 것 같다...!

그래도 새로운 알고리즘을 배운 것 같아서 좋음


package deffender_study;
import java.util.*;

public class Main{


	public static void main(String args[]){
		Scanner scan=new Scanner(System.in);
		int a,b;
		System.out.print("두 자연수 입력하라: ");
		a = scan.nextInt();
		b = scan.nextInt();
		
		int max, min; //큰 수와 작은 수를 분류하기
		if(a>b) { max = a; min = b;}
		else { max = b; min = a;}
		
		int g = 0; //최대공약수
		int tmp;
		while(g != min) {
			if(max % min == 0) {
				g = min;
			}
			else {
				tmp=max%min;
				max=min;
				min=tmp;
			}
		}
		
		int l = a*b/g; //최소공배수
		System.out.println("최대공약수는 " + g);
		System.out.println("최소공배수는 " + l);
	}
}	

while문의 무한반복을 빼고 싶어서 코드를 다시 짜봤다!

한결 더 효율적인 코드가 됐길...


유클리드 호제법?

두 수의 최대공약수를 구하는 알고리즘!

 

호제법이란?

두 수가 서로 상대방 수를 나누어서 결국 원하는 수를 얻는 알고리즘을 말한다!

 

MOD연산이란?

두 값을 나눈 나머지를 구하는 연산!

 

유클리드 호제법에 대한 이해를 돕는 증명을 설명해주심!! (이해 쏙쏙 잘됨)

https://www.youtube.com/watch?v=J5Yl2kHPAY4

 

유클리드 호제법에 대해서 잘 설명해주심

https://velog.io/@yerin4847/W1-%EC%9C%A0%ED%81%B4%EB%A6%AC%EB%93%9C-%ED%98%B8%EC%A0%9C%EB%B2%95

 

유클리드 호제법(Euclidean-algorithm)

유클리드 호제법에 대해 알아보자.

velog.io

 

'알고리즘 공부 > coding test' 카테고리의 다른 글

백준 11399 [ATM]  (0) 2022.05.18
백준 2217[로프]  (0) 2022.05.17
백준 2358 [평행선]  (0) 2022.02.08
백준 11022 [A+B-8]  (0) 2021.02.04
백준 2747 [피보나치수]  (0) 2021.01.22

+ Recent posts