<프로그래머스> N개의 최소공배수(Lv.2)
https://school.programmers.co.kr/learn/courses/30/lessons/12953?language=kotlin
매우 짧은 지문으로 인해 쉽게 생각하고 들어갔다.
최소공배수를 모르는 것도 아니고 배열의 크기도 생각보다 크지 않았기 때문이다.
하지만 생각보다 시간이 많이 걸렸다.
처음에 뻘짓을 했기 때문이다.
그 때 한 건 2부터 100을 가지고 배열을 순회하면서 배열 내의 모든 원소가 해당 숫자로 나머지 없이 나눠지면 모든 원소에 해당 숫자를 나눠 저장하는 방식이었다... 왜 이렇게 했지?
이렇게 해도 맞는 케이스가 있어서 아무런 의심없이 진행하고 제출했다가 실패 폭탄 맞고 다시 처음부터 시작했다.
'최소공배수와 최대공약수에 대해서 좀 더 봐야겠는데...? 뭔가 날로 먹으려다가 이렇게 된 거 같아'
'최대공약수는 유클리드 호제법으로 구하고, 최소공배수는 두 수의 곱에 두 수의 최대공약수를 곱하면 되네... 그러면 이걸 연속적으로 처리할 수 있게만 짜면 되겠다.!!'
이후 정신을 차리고 최대공약수와 최소공배수의 관계로 문제를 풀어나갔다.
반복문을 사용할 수 있게 두 수의 최소공배수 값을 배열 내 (현재 인덱스 + 1) 위치에 저장했다.
해당 방법으로 작성한 코드는 다음과 같다.
class Solution {
fun solution(arr: IntArray): Int {
for (i in 0 until arr.size - 1) {
arr[i + 1] = (arr[i] * arr[i + 1]) / gcd(arr[i], arr[i + 1])
}
return arr[arr.size - 1]
}
private fun gcd(a: Int, b: Int): Int {
var temp: Int
var A = a
var B = b
while (B != 0) {
temp = A % B
A = B
B = temp
}
return A
}
}
(나는 사실 매개변수로 들어오는 값들은 변경이 안 되는 val 타입으로 알고 있어서 보통 배열도 건드리지 않고 변수에 복사해서 사용했었는데 배열 내의 값들은 변경이 되더라...?! 그래서 이렇게 작성할 수 있었다.)
(물론 일반 자료형은 안 돼서 변수에 저장해서 다시 사용했지만...)