본문 바로가기
Problem Solvings & Algorithm/백준

[백준] 10757: 큰 수 A+B - Swift 풀이

by abcdesong 2021. 1. 10.

노션에서 읽기

문제

두 정수 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
}

자릿수가 적은 쪽을 판단해서 작은 수의 배열이 끝날 때까지 모두 더하는 계산을 하고,

나머지 긴 숫자에 대해서는 자리올림만 추가로 계산해주는 방식.


파이썬에서는 그냥 더하기만 해도 된다고 한다.

이래서 파이썬 파이썬 하는 것일까..

댓글