-
[프로그래머스] 최대공약수와 최소공배수 / KotlinProgrammers 2022. 2. 11. 22:05
https://programmers.co.kr/learn/courses/30/lessons/12940?language=kotlin
문제
문제 설명
두 수를 입력받아 두 수의 최대공약수와 최소공배수를 반환하는 함수, solution을 완성해 보세요. 배열의 맨 앞에 최대공약수, 그다음 최소공배수를 넣어 반환하면 됩니다. 예를 들어 두 수 3, 12의 최대공약수는 3, 최소공배수는 12이므로 solution(3, 12)는 [3, 12]를 반환해야 합니다.
제한 사항- 두 수는 1이상 1000000이하의 자연수입니다.
n m return 3 12 [3, 12] 2 5 [1, 10] 입출력 예 #1
위의 설명과 같습니다.입출력 예 #2
자연수 2와 5의 최대공약수는 1, 최소공배수는 10이므로 [1, 10]을 리턴해야 합니다.
초기 코드
class Solution { fun solution(n: Int, m: Int): IntArray { var answer = intArrayOf() return answer } }
의식의 흐름
1. 최대공약수는 두 수의 공통 약수 중의 최대값, 최소공배수는 두 수의 공통 배수중의 최소값이다.
2. 근데 이걸 어떻게 구했더라...?
3. 초등학생에 빙의하여 머리를 쥐어싸매보자 ㅠㅠ
해결 코드
import kotlin.math.* class Solution { fun solution(n: Int, m: Int): IntArray { return intArrayOf(gcd(n, m), (n * m / gcd(n, m))) } fun gcd(n: Int, m: Int): Int { if (n == 0) return m else if (m == 0) return n else { return gcd(max(n, m) % min(n, m), min(n, m)) } } }
여기서 조금 더 간단히 하면... math 임포트 제거하면
class Solution { fun solution(n: Int, m: Int): IntArray { return intArrayOf(gcd(n,m), ((n*m)/gcd(n,m))) } fun gcd(n :Int, m :Int) : Int { if (m > n) { return if (n == 0) m else gcd(n, m%n) } else { return if (m == 0) n else gcd(n%m, m) } } }
간단히 하는 법을 잘 모르겠어서 찾아봄..
유클리드 호제법
최소공배수(LCM) = (두 수의 곱) / (최소공약수) 라고 한다!
그러므로 최소공약수를 찾는 것만 만들면 되는데,
최소공약수(GCD)는 (큰 수) / (작은 수) 를 반복하며 큰 수 대신 나머지를 대입하다가,
한 개의 수가 0이 되는 순간 나머지 수가 최소공약수
띠용.....? 그러므로 재귀함수가 필요함
'Programmers' 카테고리의 다른 글
[프로그래머스] 하샤드 수 / Kotlin (0) 2022.02.11 [프로그래머스] 핸드폰번호 가리기 / Kotlin (0) 2022.02.11 [프로그래머스] 제일 작은 수 제거하기 (0) 2022.02.08 [프로그래머스] 정수 제곱근 판별 (2) 2022.02.08 [프로그래머스] 정수 내림차순으로 배치하기 / Kotlin (0) 2022.02.08