https://school.programmers.co.kr/learn/courses/30/lessons/135807#qna
프로그래머스
코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.
programmers.co.kr
변수
- arrayABMin = arrayA를 계산할때 arrayA의 최솟값, arrayB를 계산할때 arrayB의 최솟값
- arrayAfirst = arrayA의 최솟값의 약수를 담은 Int형 배열
- arrayAList = arrayAfirst에 있는 요소 중에서 arrayA는 모두 나누어 0으로 떨어지지만, arrayB는 모두 나누어 0으로 떨어지지 않는 수들이 담긴 Int형 배열
- arrayBfirst = arrayB의 최솟값의 약수를 담은 Int형 배열
- arrayBList = arrayBfirst에 있는 요소 중에서 arrayB는 모두 나누어 0으로 떨어지지만, arrayA는 모두 나누어 0으로 떨어지지 않는 수들이 담긴 Int형 배열
풀이 방법)
항상 범위를 1부터 매개변수의 최솟값까지의 수 중에 arrayA는 나눠지지만 arrayB는 안나눠지는 또는 arrayB는 나눠지지만 arrayA는 안나눠지는 수를 찾았다. 이렇게 해서 마지막에 최고로 큰 수를 반환하는 식으로 하였지만 번번히 시간 초과로 실패했다.
마찬가지로 매개변수의 최솟값부터 1까지의 범위를 다루어 봤지만 결과는 마찬가지였다.
그래서 생각해서 푼게
arrayA의 최솟값의 약수를 모두 구해서 arrayAfirst에 담았다.
만약 arrayA가 10, 20 일 경우 10의 약수를 [1,2,5,10]을 arrayAfirst에 담은셈이다.
- 그리고 이 약수들을 arrayA의 모든 요소에 접근하여 차례로 나누어 0인 값을 찾아냈다.
- 이때 arrayB의 길이가 arrayA와 같기때문에 차례로 접근할때 모두 어떠한 약수로 나누었을때 0이 아니어야 하고,
arrayA의 모든 요소에는 나누었을때 0인 수를 찾아냈다.
위에 두 조건이 만족하는 약수가 생기면 count를 1씩 증가시켰다.
count의 수가 arrayA의 수와 같으면 arrayA에는 모두 0으로 나누어지고 arrayB에는 모두 0으로 나누어 떨어지지 않는 수이기 때문에 arrayAList에 추가하였다.
동일한 방법으로 arrayB도 원하는 수를 arrayBList에 추가하였다.
1. arrayAList와 arrayBList가 모두 비어있을경우 0을 반환
2. arrayAList가 비어있고 arrayBList가 존재할 경우 arrayBList의 마지막 요소 반환
3. arrayBList가 비어있고 arrayAList가 존재할 경우 arrayAList의 마지막 요소 반환
4. 3가지 조건문이 만족되지 않는 경우에는 두 배열에 존재하는 경우이므로
삼항연산자를 통해 arrayAList의 마지막이 arrayBList보다 크거나 같을때 참이면 arrayAList의 마지막을 거짓이면 arrayBList의 마지막을 반환하도록 하였다.
import Foundation
func solution(_ arrayA:[Int], _ arrayB:[Int]) -> Int {
var arrayABMin = 0
var arrayAfirst = [Int]()
var arrayAList = [Int]()
var arrayBfirst = [Int]()
var arrayBList = [Int]()
arrayABMin = arrayA.min()!
for i in 1...arrayABMin{
if arrayABMin % i == 0{
arrayAfirst.append(i)
}
}
for j in 0..<arrayAfirst.count{
var count = 0
for p in 0..<arrayA.count{
if arrayA[p] % arrayAfirst[j] == 0 && arrayB[p] % arrayAfirst[j] != 0{
count += 1
}
}
if arrayA.count == count{
arrayAList.append(arrayAfirst[j])
}
}
arrayABMin = arrayB.min()!
for i in 1...arrayABMin{
if arrayABMin % i == 0{
arrayBfirst.append(i)
}
}
for j in 0..<arrayBfirst.count{
var count = 0
for p in 0..<arrayB.count{
if arrayB[p] % arrayBfirst[j] == 0 && arrayA[p] % arrayBfirst[j] != 0{
count += 1
}
}
if arrayB.count == count{
arrayBList.append(arrayBfirst[j])
}
}
if arrayAList.isEmpty && arrayBList.isEmpty{
return 0
}
if !arrayAList.isEmpty && arrayBList.isEmpty{
return arrayAList.last!
}
if arrayAList.isEmpty && !arrayBList.isEmpty{
return arrayBList.last!
}
return arrayAList.last! >= arrayBList.last! ? arrayAList.last! : arrayBList.last!
}
시간초과로 개고생함
'Swift랑 친해지기 > programmers 풀기' 카테고리의 다른 글
[프로그래머스] 두 수의 나눗셈 (Swift) (0) | 2022.11.24 |
---|---|
[프로그래머스] 롤케이크 (Swift) (0) | 2022.11.23 |
[프로그래머스] [1차]뉴스 클러스터링 (Swift) (0) | 2022.11.21 |
[프로그래머스] 중앙값 구하기 (Swift) (0) | 2022.11.21 |
[프로그래머스] 모음 제거 (Swift) (0) | 2022.11.21 |