일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 자료구조
- 스터디
- groupby
- 혼공파
- MySQL
- 카카오코테
- doitandroid
- Android
- 정보처리기사
- 코틀린
- 알고리즘
- 혼공단
- SQL
- CS
- 코테
- 혼공챌린지
- 오블완
- 프로그래머스
- 인프런
- 티스토리챌린지
- java
- 정처기
- 안드로이드스튜디오
- join
- Til
- 기술면접
- 안드로이드
- select
- Kotlin
- 자바
- Today
- Total
Welcome! Everything is fine.
[프로그래머스/Lv.2] N개의 최소공배수(+유클리드 호제법) - Kotlin 본문
📌 문제
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
📌 유클리드 호제법을 이용해 최대공약수(GCD) 구하기
이 문제를 풀기 전에 먼저 유클리드 호제법을 배우면 좋다. 유클리드 호제법이란 최대공약수(GCD, Greatest Common Divisor)를 찾는 효율적인 알고리즘이다. 유클리드 호제법은 두 정수 a와 b(단, a > b)의 최대공약수를 구할 때, 다음과 같은 사실을 이용한다.
GCD(a, b) = GCD(b, a % b)
이 과정을 나머지가 0이 될 때까지 반복하며, 나머지가 0이 되면 그때의 b가 두 수의 최대 공약수가 된다.
유클리드 호제법을 이용해 최대공약수를 구해보자!
- a = 56, b = 42
- GCD(56, 42) = GCD(42, 56 % 42) 이므로 a = 42, b = 14이다.
- GCD(42, 14) 에서 42 % 14은 0이므로 현재 b의 값인 14가 최대공약수가 된다.
그럼 이 과정을 코틀린 코드로 적어보자. b가 0일 경우, a의 값이 그 이전의 b의 값이므로 a를 반환한다.
fun gcd(a: Int, b: Int): Int = if (b != 0) gcd(b, a % b) else a
📌 유클리드 호제법을 이용해 최소공배수(LCM) 구하기
유클리드 호제법으로 구한 최대공약수(GCD)를 이용해 두 수의 최소공배수(LCM, Least Common Multiple)도 구할 수 있다. 최소공배수는 두 수의 곱을 그들의 최대공약수로 나눈 값이다.
LCM(a, b) = (a * b) / GCD(a, b)
유클리드 호제법을 이용해 최대공약수를 구한 후, 최대공약수를 이용해 최소공배수를 구해보자!
- a = 56, b = 42
- 위에서 유클리드 호제법으로 GCD(56, 42) = 14라는 것을 알게 되었으니 슬쩍 가져와서 최소공배수를 구한다. LCM(56, 42) = (56 * 42) / 14 = 2352 / 14 = 168
- 따라서 56과 42의 최소공배수는 168이 된다.
이 과정을 코틀린 코드로 적어보자.
fun lcm(a: Int, b: Int) = (a * b) / gcd(a, b)
이렇게 최대공약수 & 최소공배수 키워드가 나온다면 유클리드 호제법을 기억하자! 👀
📌 풀이
이제 유클리드 호제법을 이용해 문제를 풀면 되는데, 두 수의 최소공배수가 아닌 N개의 최소공배수를 구해야 한다. 하지만 배운걸 그대로 이용하면 된다. 먼저 위에서 적은 코틀린 코드를 그대로 적어준다.
fun gcd(a: Int, b: Int): Int = if (b != 0) gcd(b, a % b) else a // 최대공약수 구하기
fun lcm(a: Int, b: Int) = a * b / gcd(a, b) // 최소공배수 구하기
예시를 보면 arr = [2, 6, 8, 14] 이 주어지는데, arr[0]부터 순회하며 모든 요소에 대한 최소공배수를 구해야한다는 것을 알 수 있다. answer를 arr[0]으로 설정한 후, forEach문을 돌며 비교해나갔다.
fun solution(arr: IntArray): Int {
var answer = arr[0]
arr.forEach {
answer = lcm(answer, it)
}
return answer
}
📌 전체 코드
class Solution {
fun solution(arr: IntArray): Int {
var answer = arr[0]
arr.forEach {
answer = lcm(answer, it)
}
return answer
}
fun gcd(a: Int, b: Int): Int = if (b != 0) gcd(b, a % b) else a
fun lcm(a: Int, b: Int) = a * b / gcd(a, b)
}
'프로그래머스 > Lv.2' 카테고리의 다른 글
[프로그래머스/Lv.2] 귤 고르기 - Kotlin (0) | 2024.09.10 |
---|