Kotlin/Algorithm Problems

<프로그래머스> N개의 최소공배수(Lv.2)

re트 2023. 11. 14. 16:11
728x90

https://github.com/heesoo-park/ForCodeKata/tree/main/N%EA%B0%9C%EC%9D%98%20%EC%B5%9C%EC%86%8C%EA%B3%B5%EB%B0%B0%EC%88%98

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 타입으로 알고 있어서 보통 배열도 건드리지 않고 변수에 복사해서 사용했었는데 배열 내의 값들은 변경이 되더라...?! 그래서 이렇게 작성할 수 있었다.)

(물론 일반 자료형은 안 돼서 변수에 저장해서 다시 사용했지만...)

반응형