[Swift 코테] 백준 2981검문 (swift 런타임 에러)

2022. 8. 2. 22:08Swift 코딩테스트/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