문제
두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.
- 입력: 첫째 줄에 A와 B가 주어진다. (0 < A,B < 10^10000)
- 출력: 첫째 줄에 A+B를 출력한다.
풀이
10의 10000승이면 Int64의 최댓값(9,223,372,036,854,775,807)을 한참 넘어가는 범위이다.
그래서 처음에는 18자리씩 끊어서 배열에 넣고 차례로 더하는 방식으로 풀어 보았다. 그랬더니 두 수의 자릿수가 다를 때의 처리가 너무너무 복잡해서 도저히 해결되지 않았다.
그래서 1자리 씩 끊는 것으로 방법을 바꿨다.
let arr = readLine()!.split(separator: " ")
let a = splitNum(String(arr[0])), b = splitNum(String(arr[1]))
let l = isALonger(a,b) ? a : b
let s = isALonger(a,b) ? b : a
print(addNum(l,s))
func splitNum(_ str: String) -> [Int] {
let intArr = str.map{ Int(String($0))! }
return intArr
}
func isALonger(_ a: [Int],_ b: [Int]) -> Bool {
return a.count >= b.count ? true : false
}
func addNum(_ l: [Int],_ s: [Int]) -> String {
var long = l, short = s
var carry = 0, sum = 0
var result = ""
func updateResult() {
if sum > 9 {
carry = 1
sum = long.isEmpty ? sum : sum-10
}
result = String(sum) + result
}
while !short.isEmpty {
sum = long.last! + short.last! + carry
carry = 0
long.removeLast()
short.removeLast()
updateResult()
}
while !long.isEmpty {
sum = long.last! + carry
carry = 0
long.removeLast()
updateResult()
}
return result
}
자릿수가 적은 쪽을 판단해서 작은 수의 배열이 끝날 때까지 모두 더하는 계산을 하고,
나머지 긴 숫자에 대해서는 자리올림만 추가로 계산해주는 방식.
파이썬에서는 그냥 더하기만 해도 된다고 한다.
이래서 파이썬 파이썬 하는 것일까..
'Problem Solvings & Algorithm > 백준' 카테고리의 다른 글
[백준] 1371: 가장 많은 글자 (feat. EOF) - Swift (0) | 2021.01.24 |
---|---|
[백준] 1052: 물병 - Swift 풀이 (0) | 2021.01.10 |
[백준] 1076: 저항 - Swift (0) | 2021.01.06 |
[백준] 1009: 분산 처리 - Swift (0) | 2021.01.06 |
[백준] 4673: 셀프 넘버 - Swift (0) | 2021.01.03 |
댓글