오늘은 Math 패키지에 관해 정리하다가 빼먹었던 min과 max에 대해 정리해보고 문제를 풀어본 내용을 정리해보았다.
1. Math 패키지의 min과 max
이틀전에 Math 패키지에 관해 정리했던 글에는 min과 max에 관해서는 빼먹었었는데 정리해두면 좋을 것 같아 추가로 정리해보았다.
https://moomoo11.tistory.com/35
24-04-11 Kotlin Math 패키지 사용하기
공부를 하다보니 기본으로 제공되는 산술연산같은 것 말고 다른 연산이 필요한 경우가 생겼다. 따라서 코틀린에서 제공하는 Math 패키지를 사용하는 법을 공부해보고 정리해보았다. 아래의 코틀
moomoo11.tistory.com
먼저 min과 max를 사용하려면 당연히 먼저 Math 패키지를 불러와야한다.
min과 max는 두 수를 인자로 받아, min은 둘 중 작은 수를, max는 둘 중 작은 수를 반환한다.
아래 작성한 코드를 보면 쉽게 이해할 수 있을 것이다.
import kotlin.math.*
fun main() {
// 두 Int
println(max(1,10)) // 10
println(min(1,10)) // 1
// Long과 Int
// 기본적으로 두 인자의 타입이 같아야 하지만 Lont과 Int의 경우는 사용가능하다
println(max(1L,10)) // 10 (Long 타입)
println(min(1,10L)) // 1 (Long 타입)
// Long 타입으로 출력되는 것을 볼수있다.
println(max(1L,10)::class.java) // long
// 두 Long
println(max(1L,10L)) // 10 (Long 타입)
println(min(1L,10L)) // 1 (Long 타입)
println(max(1.5f,10.5f)) // 10.5 (Float 타입)
println(min(1.5f,10.5f)) // 1.5 (Float 타입)
println(max(1.5,10.5)) // 10.5 (Double 타입)
println(min(1.5,10.5)) // 1.5 (Double 타입)
}
간단하기 때문에 정리한 내용은 이것이 전부이다.
문제를 풀다가 위의 내용을 활용하면 좋을 것 같아 정리해보았다. 이제 위 내용을 활용해 문제를 하나 풀어보려고 한다.
2. 문제 풀어보기
프로그래머스에 있는 'N개의 최소공배수' 문제를 풀어보았다.
2-1. 문제
[문제]
- 문제 설명
두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해주세요.
- 제한 사항
- arr은 길이 1이상, 15이하인 배열입니다.
- arr의 원소는 100 이하인 자연수입니다.
- 입출력 예
arr | result |
[2, 6, 8, 14] | 168 |
[1, 2, 3] | 6 |
2-2. 문제 풀이
위 문제를 풀려면 수학적 지식을 어느정도 알고 있으면 좋다. 두 수의 최소공배수는 두 수를 곱한 뒤, 두 수의 최소공약수로 나눠주면 구할 수 있다.
그렇기 때문에 먼저 두 수의 최소공약수를 구하는 방법부터 알아야한다. 나는 유클리드 호제법을 이용하여 풀었는데 그 내용은 찾아보면 자세히 정리되어 잘 나오기 때문에 여기에 따로 정리하지는 않겠다.
그래도 결론만 적어보면 a와 b의 최소공배수(a≥b일 때)는 a를 b로 나눈 나머지를 r이라고 했을 때 b와 r의 최소공배수와 같다는 것이 그 내용이다. 따라서 a와 b보다 더 작은 수인 b와 r을 이용해 최소공배수를 구할 수 있다는 이야기이고 이 과정을 계속 반복하다가 나머지 r이 0이 나왔을때의 b의 값이 바로 최소공배수가 된다.
위의 내용을 코드로 작성해 최소 공약수를 만드는 함수를 한 번 만들어 보았다. 이 때 a에는 둘 중의 큰 값을 b에는 둘 중의 작은 값을 넣어줘야 하기에 max와 min함수를 사용해보았다.
import kotlin.math.*
fun main() {
println(minDivisor(120,60)) // 60
println(minDivisor(18,24)) // 6
// 정상적으로 최소공약수가 구해지는 것을 볼 수 있다
}
fun minDivisor(int1:Int, int2:Int) :Int {
var a = max(int1, int2) // 둘 중에 큰 수가 a에 들어간다
var b = min(int1, int2) // 둘 중에 작은 수가 b에 들어간다
while (b != 0) {
val r = a % b
a = b
b = r
}
return a
}
최소공약수를 구하는 법을 알았기 때문에 이제는 n개의 수에 대한 최소공배수를 구하기만 하면 된다.
내가 선택한 방법은 먼저 최소공배수가 될 변수를 하나 선언해주고 이 변수에 배열의 첫 번째 요소를 넣어준다. 그 다음 반복문을 이용해 변수의 나머지 요소들과 이 변수와의 최소공배수를 하나씩 구한 뒤 이 변수에 다시 넣어주는 식으로 코드를 작성했다.
import kotlin.math.*
class Solution {
fun solution(arr: IntArray): Int {
var commonMultiple = arr[0]
// 최소공배수가될 변수를 선언하고 배열의 첫 번째 요소를 넣어준다
for (i in 1..arr.size-1) {
var a = max(arr[i], commonMultiple)
var b = min(arr[i], commonMultiple)
while (b != 0) {
val r = a%b
a = b
b = r
}
val minDivisor = a
commonMultiple = arr[i] * commonMultiple / minDivisor
// 최소공배수는 두 수의 곱에 최소공약수를 나누어 구할 수 있다
}
return commonMultiple
}
}
위와 같이 코드를 작성했더니 정상적으로 답안으로 통과되었다.
답안을 작성할 때는 두 수 중 큰 값과 작은 값을 넣어주는 방법으로 저 두 함수를 이용하는 방법밖에 안 떠올랐다. (어제 마침 Math 패키지에 대해 정리하다가 두 함수를 봤기 때문인 것 같다.)
지금 다시 생각해보니 if문 만으로도 간단하게 코드를 작성할 수 있을 것 같다.
var a = if(arr[i] > commonMultiple) arr[i] else commonMultiple
var b = if(arr[i] > commonMultiple) commonMultiple else arr[i]
코드 실행속도는 조금이나마 if문을 활용한 것이 빠른 것으로 나왔다. 그래도 min과 max를 활용하면 한 눈에 무슨 뜻인지 알기 쉽다는 장점이 있는 것 같다.
3. 오늘 알게 된 것
- 배워두었던 Math 패키지를 활용해 코드를 작성해보았다.
- 파일과 디렉터리에 관한 CS 지식에 관해 공부해보았다.
'오늘 배운 것' 카테고리의 다른 글
24-04-15 오늘 배운 것 (부트캠프 첫 날) (0) | 2024.04.15 |
---|---|
24-04-14 Kotlin 컬렉션 정렬하기 (0) | 2024.04.14 |
24-04-12 Kotlin Math 패키지 이용하여 문제 풀어보기 (0) | 2024.04.12 |
24-04-11 Kotlin Math 패키지 사용하기 (0) | 2024.04.11 |
24-04-10 Kotlin 동등성과 동일성 (0) | 2024.04.10 |