반응형
안녕하세요. 개발 중인 정주입니다.
오늘은 프로그래머스(Lv.2) - N개의 최소공배수 문제를 풀었습니다.
목차
Github
문제 링크
풀이
이번 문제는 수학을 물어보는 문제입니다.
먼저 맨 앞 두 숫자의 최소 공배수를 구하고 그 최소공배수와 그 다음 수의 최소공배수를 다시 구하는 방법을 반복하면 됩니다.
처음에는 반복문을 이용해서 해결했는데요.
reduce를 이용한 답변을 보고 기가 막히다고 생각해서 수정을 했습니다.
reduce에 lcm 클로저를 전달해서 그 결과와 다음 수와의 lcm을 구할 수 있습니다.
의문인 점
다만 한 가지 의문인 점은 실행 속도입니다.
func solution(_ arr:[Int]) -> Int {
//return arr.reduce(1) { lcm($0, $1) } //0.02 ~ 0.03ms
return (1..<arr.count).reduce(arr.first!) { lcm($0, arr[$1]) } //0.06 ~ 0.11ms
}
1라인 코드로 해결을 했을 때는 0.02~0.03ms가 소요되지만 2라인 코드로 해결했을 때는 0.06~0.11ms가 소요됩니다.
한 번의 반복이 덜 일어나니 아주 살짝이지만 더 빨리 되지 않을까 생각을 했었는데요.
배열 요소 참조에 시간이 더 오래 걸리는 건가 싶습니다.
그러면서도 reduce도 배열 참조를 해서 값을 가져오는게 아닌가?하는 생각도 들어서 의문이네요.
혹시 이유를 아시는 분은 댓글로 알려주시면 감사하겠습니다.
전체 코드
import Foundation
func solution(_ arr:[Int]) -> Int {
//return arr.reduce(1) { lcm($0, $1) } //0.02 ~ 0.03ms
return (1..<arr.count).reduce(arr.first!) { lcm($0, arr[$1]) } //0.06 ~ 0.11ms
}
func gcd(_ a: Int, _ b : Int) -> Int {
let maxNum = max(a, b)
let minNum = min(a, b)
let remain = maxNum % minNum
return remain == 0 ? minNum : gcd(minNum, remain)
}
func lcm(_ a: Int, _ b: Int) -> Int {
return a * b / gcd(a, b)
}
let arr = [2,6,8,14]
print(solution(arr))
아직은 초보 개발자입니다.
더 효율적인 코드 훈수 환영합니다!
공감과 댓글 부탁드립니다.
반응형