[Swift] [17일차] N개의 최소공배수

·2024년 12월 24일
0

SwiftAlgorithm

목록 보기
20/105

programmers-N개의 최소공배수

문제 설명

  1. 최소공배수 구하기
  2. 근데 숫자 두개가 아니라 배열에 들어간만큼 (최대 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) -> ...
profile
기억보단 기록을

0개의 댓글