본문 바로가기
Kotlin(프로그래머스)/Level 2

[프로그래머스/Kotlin] N개의 최소 공배수

by Yuno. 2022. 4. 18.
728x90

문제 링크 -> https://programmers.co.kr/learn/courses/30/lessons/12953/solution_groups?language=kotlin 

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문제 설명

두 수의 최소공배수(Least Common Multiple)란 입력된 두 수의 배수 중 공통이 되는 가장 작은 숫자를 의미합니다. 예를 들어 2와 7의 최소공배수는 14가 됩니다. 정의를 확장해서, n개의 수의 최소공배수는 n 개의 수들의 배수 중 공통이 되는 가장 작은 숫자가 됩니다. n개의 숫자를 담은 배열 arr이 입력되었을 때 이 수들의 최소공배수를 반환하는 함수, solution을 완성해 주세요.

제한 사항
  • arr은 길이 1이상, 15이하인 배열입니다.
  • arr의 원소는 100 이하인 자연수입니다.

------------------------------------------------------------풀이------------------------------------------------------------------
- 유클리드 호재법을 응용해서 풀이하였습니다. 

1. arr의 n번째와 n-1번 째의 최소 공배수를 구합니다. 
2. arr의 n-2부터 0까지 내려가면서 answer%arr[i] == 0 이라면 arr[i]와 이전의 원소들의 최소공배수는 answer입니다. 
3. answer%arr[i] != 0 아니라면 answer과 arr[i]의 최소 공배수를 다시 구하여 answer에 넣어줍니다. 

class Solution {
    fun solution(arr: IntArray): Int {
        var answer = (arr[arr.size-2]*arr[arr.size-1])/gcd(arr[arr.size-2], arr[arr.size-1])

        for( i in arr.size-1 downTo 0){
            if(answer%arr[i] != 0){
                answer = (answer*arr[i])/gcd(answer,arr[i])
            }
        }
        return answer
    }
    fun gcd( x:Int, y:Int) : Int = if(y !=0) gcd(y , x%y) else x
}

뒤에서 부터 시작한 이유는 테스트 케이스가 오름차순으로 정렬되어있길래 나머지 테스트 케이스도 오름차순이라면 가장 뒤의 공배수부터 찾아서 아래로 내려가는편이 빠를 것이라고 생각해서 뒤에서부터 시작해 주었습니다. 
하지만 원소의 수가 15개로 제한되어있고 100이하여서, 앞으로 하는것과 실행시간의 차이는 무의미 하였습니다. 

------------------------------------------------------------결과------------------------------------------------------------------

- 문제에 대한 질문 댓글 환영!
- 중간에 잘못된 부분이 있다면 댓글로 남겨주세요. 수정하겠습니다.

728x90

댓글