본문 바로가기
Algorithm/백준 알고리즘

BOJ(2609) - Kotlin

by 클리마 2022. 6. 7.
728x90

문제

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

입력

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

출력

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

 

나의 접근방법

최대공약수를 위한 알고리즘 중에 '유클리드 호제법'이라는 알고리즘이 있다. 이 알고리즘을 구현해 문제를 풀려고 했다. 최대공약수를 구하기만 하면 최소공배수는 각 수를 최대공약수로 나눈 몫 X 최대공약수 이기 때문에 이 알고리즘을 구현하는게 가장 중요한 문제였다. '유클리드 호제법'이 무엇인지 궁금하다면 구글링을 해보시기 바란다.

여기서 간단하게 설명하자면 두 수를 나눈 나머지가 0이 될 때까지 계속 나눴을 때 0으로 만드는 작은 수가 최대공약수가 된다는 알고리즘이다. 솔직히 중, 고등학교 때 이런 알고리즘이 있었는지 전혀 몰랐던 것 같다. 암튼 이 알고리즘을 구현하기 위해서 나는 큰 수와 작은 수를 픽스해주려고 두 수의 크기에 맞춰서 계산을 하도록 코드를 구현했다.

코드

/* 최대공약수와 최소공배수 */

import java.util.Scanner

fun main() = with(Scanner(System.`in`)) {
    val num1 = nextInt()
    val num2 = nextInt()
    val gcd: Int

	// 지속적으로 계산하기 위해 쓰일 변수
	var n1 = num1
	var n2 = num2
    
	// 지속적인 나눗셈을 위한 반복문
	while (true) {
		var tmp: Int

		// 맨 처음 입력받는 두 수 중 어느 것이 큰 수인지를 알 수 없어 만든 조건문
		if (n1 > n2) {
        	// 첫번 째 이후로는 계속해서 이 조건으로 분기할 것이다.
        	// 왜냐하면 밑에서 n1을 큰 수로 설정해주기 때문
			tmp = n1 % n2
			n1 = n2
		} else {
			tmp = n2 % n1
            }
		n2 = tmp

		
		if (n2 == 0) {		// 나머지가 0이 됐을 때 최대공약수 출력하고 반복문 종료
			println(n1)		// 최대공약수 출력
			gcd = n1
			break
            }
        }
	println(gcd*(num1/gcd)*(num2/gcd))	// 최소공배수 출력
}
728x90

'Algorithm > 백준 알고리즘' 카테고리의 다른 글

BOJ(10104) - Kotlin  (0) 2022.06.09
BOJ(2605) - Kotlin  (0) 2022.06.07
BOJ(1436) - Kotlin  (0) 2022.06.03
BOJ(1181) - Kotlin  (0) 2022.06.02
BOJ(11050) - Kotlin  (0) 2022.05.31