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 매서드를 이용해 연산
}
'Swift랑 친해지기 > programmers 풀기' 카테고리의 다른 글
[프로그래머스] 뒤에 있는 큰 수 찾기 (Swift) (1) | 2023.10.12 |
---|---|
[프로그래머스] 연속된 부분 수열의 합 (Swift) (1) | 2023.09.06 |
[프로그래머스] 최댓값과 최솟값 (Swift) (0) | 2023.07.24 |
[프로그래머스] 타겟넘버 (Swift) ※1,2번 실행초과 (0) | 2023.07.12 |
[프로그래머스] 피로도 (Swift) (0) | 2023.07.10 |