[Swift 코테] 백준 2981검문 (swift 런타임 에러)
2022. 8. 2. 22:08ㆍSwift 코딩테스트/Swift 백준 문제 풀이
728x90
주어진 수의 최대공약수의 약수를 구하는 문제이다.
- 주어진 수의 규칙을 찾아내는 것이 중요하다.
- 나머지(r)가 모두 같게 되는 M을 구하는 문제
1. 모든 수에서 r을 빼면 M으로 나눠진다.
2. 가장 큰 M을 구하고(최대공약수), M의 약수를 구하면 된다.
- 사실 이 문제를 풀면서 런타임 에러가 많이 발생했는데 이유를 찾을 수 있었다.
- 차(gap: input[1] - input [0])를 새로운 정렬에 저장해서 gcf를 구했는데, 이때 변수의 범위를 잘 못 지정해서 런타임 에러가 발생했다.
for i in 1..<T{
gap.append(abs(input[i - 1] - input[i]))
}
var result = gcf(a: gap[0], b: gap[1])
//이 부근에서 2로 시작하는 부분에서 문제가 발생한 것으로 추측
for i in 2..<gap.count{
result = gcf(a: result, b: gap[i])
}
- gap 배열이 1개일 수 도 있기 때문을 생각하며 문제를 풀어야 했다.
var result = gap[0]
for i in 1..<gap.count{
result = gcf(a: result, b: gap[i])
}
//코드
import Foundation
//최대공약수의 약수를 찾는 문제
//최대공약수 찾기
func gcf(a: Int, b: Int) -> Int{
var smaller = min(a, b)
var bigger = max(a, b)
if smaller == 0 {
return bigger
}
return gcf(a: smaller, b: bigger % smaller)
}
func divide(n: Int) -> [Int]{
var answer: [Int] = []
for i in 2..<Int(sqrt(Double(n)) + 1) {
if n % i == 0 {
answer.append(i)
answer.append(n / i)
}
}
answer.append(n)
return answer
}
let T = Int(readLine()!)!
var input = [Int]()
var gap = [Int]()
for _ in 0..<T{
let temp = Int(readLine()!)!
input.append(temp)
}
for i in 1..<T{
gap.append(abs(input[i - 1] - input[i]))
}
var result = gap[0]
for i in 1..<gap.count{
result = gcf(a: result, b: gap[i])
}
var answer = Array(Set(divide(n: result))).sorted(by: <)
for answer in answer{
print(answer, terminator: " ")
}
728x90
'Swift 코딩테스트 > Swift 백준 문제 풀이' 카테고리의 다른 글
[Swift 코테] 백준 15649, 15650, 15651, 15652 N과 M (0) | 2022.09.05 |
---|---|
[Swift 코테] 백준 11051 이항 계수2 (0) | 2022.08.03 |
[Swift 코테] 백준 2609 최대공약수와 최소공배수 (0) | 2022.07.27 |
[Swift 코테] 백준 1004 어린왕자 (0) | 2022.07.19 |
[Swift 코테] 백준 2477 참외밭 (0) | 2022.07.17 |