문제 설명
- 최소공배수 구하기
- 근데 숫자 두개가 아니라 배열에 들어간만큼 (최대 15)
풀이과정
문제는 간단했는데, 아마 그냥 최소공배수를 구하돼, 숫자 여러개이면 어떡할건지 묻는 것 같았다.
일단 최소공배수가 두 수의 곱을 를 최대공약수로 나눈 것
이므로, 최대 공약수와 최소공배수 함수를 만들어줬다.
.
func gcd(_ a: Int, _ b: Int) -> Int {
guard b != 0 else { return a }
return gcd(b, a % b)
}
func lcm(_ a: Int, _ b: Int) -> Int {
return a * b / gcd(a, b)
}
a,b = b , a%b
를 재귀로 만들어줬다. a%b
가 0이될 때 까지.빈배열을 하나 만들어준다음에 계속 pop해주면서 새로운값을 넣어주는 것을 반복했다. 이러면 배열에 하나 남은 원소를 return 해주는 방식으로 구성했다.
완성코드
func gcd(_ a: Int, _ b: Int) -> Int {
guard b != 0 else { return a }
return gcd(b, a % b)
}
func lcm(_ a: Int, _ b: Int) -> Int {
return a * b / gcd(a, b)
}
func solution(_ arr: [Int]) -> Int {
// 2개씩봐주기 ?
var answer: [Int] = [arr[0]]
for i in 1 ..< arr.count {
let last = answer.removeFirst()
answer.append(lcm(last, arr[i]))
}
return answer[0]
}
popLast()
를 하면 옵셔널이 되어버려서 강제언래핑해주지않고 removeFirst
를 해줬고, 여러 수에 대해서는 이렇게 차례대로 2개씩 비교를 해줬는데 이제 다른분들은 어떻게 작성했는지 보려고 한다!
채점 결과
정확성: 100.0
합계: 100.0 / 100.0
func gcd(_ a: Int, _ b: Int) -> Int {
let r = a % b
if r != 0 {
return gcd(b, r)
} else {
return b
}
}
func lcm(_ m: Int, _ n: Int) -> Int {
return m / gcd(m, n) * n
}
func solution(_ arr:[Int]) -> Int {
return arr.reduce(1) { lcm($0, $1) }
}
전반적인 코드는 동일한데
return arr.reduce(1) { lcm($0, $1) }
이 부분 보면서 진짜 기발하다고 느꼈다.
최소 공배수니까 처음 값으로 1을 주면서 자연스럽게 값을 축적해나갈 수 있게끔 구성한게 정말 좋다고 느꼈다. 다음부터는 이렇게 좀 쌓아나가야한다.. 라는 생각이들면 reduce를 들먹거려봐야겠다.
초기 값: 1
1. LCM(1, a) -> a
2. LCM(결과, b) -> a,b
3. LCM(결과, c) -> ...