처음에 생각했던건 factorial 함수를 만들어서 사용하는 것이었다.
응.....망함..
이항계수와 관련된 파스칼의 삼각형의 성질 중 하나를 사용해서 코드를 작성했다.
처음엔 어떻게 작성하나 막막했는데 2d array로 만들었음
1. factorial 함수 이용 -> 런타임 에러 (망한코드)
더보기
정확한 원인은 모르겠지만 N이 무려 1000까지 올 수 있기 때문에 팩토리얼을 구하는 과정에서 수가 너무 커져서 오버플로우 발생한 것으로 추정됨.
정답 뜨고나서 다른 사람들이 정답으로 인정된 코드도 확인했는데, 팩토리얼을 사용한 사람은 없었고 모두 파스칼 삼각형을 이용한 것으로 보아 팩토리얼을 사용하면 무조건 오버플로우가 발생하는 것 아닐까 사료됨
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
var result = getFactorial(input[0]) / (getFactorial(input[1])*getFactorial(input[0]-input[1]))
print(result%10007)
func getFactorial (_ num:Int) -> Int {
if num <= 1 {
return 1
}
return num * getFactorial(num-1)
}
2. 파스칼의 삼각형 이용
// 11051 이항계수2 -2, 파스칼의 삼각형 이용
let input = readLine()!.split(separator: " ").map{Int(String($0))!}
var arr: [[Int]] = Array(repeating: Array(repeating: 0, count: input[0]+1), count: input[0]+1)
var result = 0
for i in 1...input[0] {
for j in 0...input[0] {
if j == 0 || j == i {
arr[i][j] = 1
} else {
arr[i][j] = (arr[i-1][j-1] + arr[i-1][j])%10007
// 10007로 나눈 나머지 값을 배열에 넣어야 오버플로우가 발생하지 않는 듯.
}
}
}
print(arr[input[0]][input[1]])
이 경우도 배열 값을 넣는 과정에서 미리 %10007로 구한 값을 넣어야 오버플로우가 발생하지 않는 듯함
배열에 모든 값을 넣은 다음 출력 과정에서 %10007을 하면 마찬가지로 런타임에러가 발생하게 된다.
백준에서 런타임에러가 뜨는 경우에 대해 작성되어 있는 페이지가 있긴 한데
스위프트는 어떤 경우에 런타임에러가 뜨는지 따로 명시되어있지 않아서 마음고생 많이 했던 문제..
백선생님......................................................
'알고리즘문풀 with SWIFT > Baekjoon' 카테고리의 다른 글
swift ) 백준 9375 - 패션왕 신해빈 (0) | 2022.04.29 |
---|---|
swift ) 백준 1010 다리놓기 (0) | 2022.04.28 |
swift ) 백준 11050 이항계수1 (0) | 2022.04.26 |
swift ) 백준 3036 링 (0) | 2022.04.25 |
swift ) 백준 2981 검문 - 시간초과 극복!!!!!!!!!!!!!!!!!!! (0) | 2022.04.25 |