Language/Swift

[프로그래머스] 두 수의 합 : Int범위를 넘어가는 경우 String으로 합 구하기

paran21 2023. 7. 17. 09:06

https://school.programmers.co.kr/learn/courses/30/lessons/181846

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

문자열로 주어진 숫자 두 개의 합을 구해 문자열로 반환하는 문제이다.

 

문제를 얼핏 봤을 때는 간단해 보였지만, 이 문제의 핵심은 문자열로 주어진 수가 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"

 

이렇게 풀면 각 자리수만 정수로 변환해서 더하기 때문에 범위에 걸릴 일은 없다.