[프로그래머스] 두 수의 합 : Int범위를 넘어가는 경우 String으로 합 구하기
https://school.programmers.co.kr/learn/courses/30/lessons/181846
문자열로 주어진 숫자 두 개의 합을 구해 문자열로 반환하는 문제이다.
문제를 얼핏 봤을 때는 간단해 보였지만, 이 문제의 핵심은 문자열로 주어진 수가 Int의 범위를 넘어간다는 것이다.
양수라는 점을 감안해 UInt64를 사용한다고 하더라도 최대 값을 넘어간다.
그래서 이 문제를 풀기 위해서는 정수로 변환해서 합을 구할 수 없고, 일의 자리부터 자리수를 더해야 한다.
(손으로 더하기 문제 풀 때처럼 일의 자리부터 하나씩 더하고 10이 넘으면 다음 자리수와 함께 계산하는 방식!)
1. 일의 자리부터 한 자리 씩 정수로 변환해서 더하고,
2. 더한 값은 해당 자리수의 String으로 변환해서 추가한다.
3. 만약 10이 넘어간다면 다음 자리수를 계산할 때 같이 계산한다.
func solution(_ a:String, _ b:String) -> String {
var a = a, b = b
var answer = ""
var temp = 0
while !a.isEmpty || !b.isEmpty {
//마지막 자리를 정수로 변환해 더한다
if !a.isEmpty {
temp += Int(String(a.last!))!
a.removeLast()
}
if !b.isEmpty {
temp += Int(String(b.last!))!
b.removeLast()
}
//더한 값이 10을 넘길 수 있기 때문에 10의 나머지만 정수로 변환하고
answer = String(temp % 10) + answer
//남은 수는 다음 자리수를 계산할 때 같이 계산한다.
temp /= 10
}
if temp != 0 {
answer = String(temp) + answer
}
return answer
}
예를 들어 "123" + "678"을 더한다면,
1-1. 문자의 마지막 자리부터 더한다 : 3 + 8 = 11
1-2. 결과 값 중 1의 자리는 변하지 않는 값이므로 String으로 변환한다 : "1" + "" = "1"
1-3. 더한 값이 10을 넘어가기 때문에 1을 올려 다음 자리 수를 계산할 때 함께 계산한다.
2-1. 다음 자리수와 이전에 올린 값을 함께 계산한다 : 1(올린값) + 2 + 7 = 10
2-2. 결과 값 중 1의 자리는 변하지 않는 값이므로 String으로 변환하다 : "0" + "1"(앞의 결과값) = "01"
2-3. 더한 값이 10을 넘어가기 때문에 1을 올려 다음 자리 수를 계산할 때 함께 계산한다.
...
답은 "801"
이렇게 풀면 각 자리수만 정수로 변환해서 더하기 때문에 범위에 걸릴 일은 없다.