Swift랑 친해지기/programmers 풀기

[프로그래머스] N개의 최소공배수 (Swift)

데브킹덕 2023. 9. 5. 16:56

https://school.programmers.co.kr/learn/courses/30/lessons/12953

 

프로그래머스

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

programmers.co.kr

풀이)

나눗셈을 이용하여 최소공배수를 구했다.

1을 제외한 수중에서 두가지 이상의 숫자가 나눠지면 계속 나누면 된다.

예제로 12,32,45,67,72 의 최소공배수를 구할때 다음과 같이 구할 수 있다.

2 |  12  32  45  67  72

3 |  6    16   45  67  36

2  | 2    16   15  67  12 

3 |  1     8    15  67   6

2  |  1     8   5   67    2

     ------------------

     1      4    5   67     1

 

2 * 3 * 2 * 3 * 2 * 1 * 4 * 5 * 67 * 1 = 96480 최소공배수이다.

 

 

마찬가지로 코드 로직을 다음과 같이 구현했다.

 

import Foundation


func solution(_ arr:[Int]) -> Int {
    
    var arr1 = arr  // arr배열을 받아 나머지로 변환될 배열
    var divideCount = 0  //2이상의 수로 나누었을 경우 배열안에 수중 나누어 지는 수가 2개이상인지 파악하는 변수
    var stackArr = [Int]() //2이상의 수로 나누었을 경우 2개이상 나눠 질때 나누는 수를 담을 배열
    
    var i = 2  //2이상의 수로 나눌 수
    while i <= arr1.max()!{        // arr1의 최대값이 될때까지 나눔
        for j in arr1{             
            if j % i == 0 {
                divideCount += 1    //나눠지는 경우 divideCount +1
            }
        }
        if divideCount >= 2{          //divideCount가 둘이상이면 
            stackArr.append(i)        //나누는 수를 배열에 추가하고
            for p in 0..<arr1.count{  //나눈 값들로 arr1을 변경 
                if arr1[p] % i == 0 {
                    arr1[p] = arr1[p] / i
                }
            }
            i = 2     //변경되었으니 다시 나눌 수를 2부터 변환
            
        }
        else{
            i += 1  // 나눠지는 수가 2개이상 없을 경우 i증가
        }
    
        divideCount = 0  // divideCount도 0으로 초기화
    }
    
    let a = arr1 + stackArr  //나눠서 몫을 가지는 arr1과 나눌 값을 저장한 stackArr을 합침
    
    return a.reduce(1, *)  //reduce 매서드를 이용해 연산
}