Where who wants to meet someone

백준 Swift [10757] 큰 수 A+B 본문

백준 알고리즘 문제 기록/일반 수학 1

백준 Swift [10757] 큰 수 A+B

Lust3r 2023. 7. 1. 16:34
728x90

난이도

브론즈 V

 

문제

https://www.acmicpc.net/problem/10757

 

10757번: 큰 수 A+B

두 정수 A와 B를 입력받은 다음, A+B를 출력하는 프로그램을 작성하시오.

www.acmicpc.net

 

내 답안

/*
 1. 자리수가 다를 수 있으므로 입력값을 뒤집어 String으로 만든다
 (처음에는 그냥 쪼개기만 했었는데, 부족한 자릿수를 채우기 위해 String(repeating)을 쓰기 위해 타입을 맞춰주고자 String으로 바꿔주었고,
 마지막 수부터 더하기 위해서는 역순으로 봐야 했기에 각각 이 작업을 해주기보다 쪼갤 때 해주면 좋겠다고 결론 내렸다)
*/

let input = readLine()!.split(separator: " ").map { String($0.reversed()) }

/*
 2. 자릿수 차이를 계산하기 위해 longOne, shortOne, difference 프로퍼티 생성
 여기서는 단순히 count로 크기 비교를 하면 longOne과 shortOne이 같게 나올 수 있기 때문에 같거나 큰 값을
 longOne으로 두고, shortOne은 그 longOne의 값에 따라 다른 한 값을 갖도록 하였다.
 그리고 이후 반복문에서 각각의 요소를 더해야 하기 때문에 Array를 통해 String.Element로 만드는 작업 진행
*/

let longOne = input[0].count >= input[1].count ? Array(input[0]) : Array(input[1])
var shortOne = longOne == Array(input[0]) ? Array(input[1]) : Array(input[0])

// 3. 자릿수 맞추기
let difference = String(repeating: "0", count: longOne.count - shortOne.count)

shortOne = shortOne + difference

// 4. 각 자리에서 추가로 더해야 할 값 count와 더한 값을 저장할 newOne 프로퍼티 생성

var count = 0
var newOne = ""

// 5. 반복문을 통해 각 자리수를 더해주는 작업 진행

for i in longOne.indices {
	// 더할 때 이전에 count된(10 이상의 오버된) 수를 같이 더해준다(처음에는 0이기 때문에 무관)
    let sumValue = Int(String(longOne[i]))! + Int(String(shortOne[i]))! + count
    // 더하고 나서는 count가 유지되면 안되기 때문에 초기화
    count = 0

	// sumValue가 10 이상의 수라면 count는 십의 자리를 저장, newOne에는 나머지를 추가
    if sumValue >= 10 {
        count = sumValue / 10
        newOne += String(sumValue % 10)
    } else {
    	// 10 미만의 수라면 newOne에 sumValue를 String으로 캐스팅하여 추가
        newOne += String(sumValue)
    }
}

/*
 가장 긴 수의 자리수만큼 덧셈을 했기 때문에 마지막 계산 결과로 sumValue가 10 이상이 나왔다면
 그 count는 처리되지 않기 때문에 count가 0이라면 다시 reversed한 값을 String으로 묶어 출력,
 0이 아니라면 그 값을 마지막에 더해주고 reversed해서 출력하도록 했다.
*/

count == 0 ? print(String(newOne.reversed())) : print(String((newOne + String(count)).reversed()))

이전에 풀었던 단순 더하기가 왜 여기서 나올까 하고 문제 설명을 보니
'파이썬 같은 언어는 10,000자리 정도의 자연수도 자유롭게 다룰 수 있습니다. 하지만 C/C++이라면 이 문제를 어떻게 풀까요? C/C++ 사용자가 아니더라도 고민해 보면 좋을 것입니다.'

라고 한다.

 

실제로 Swift도 해보니 바로 Int의 범위를 넘어서기 때문에 오류가 난다.

Swift Int 문서에 따르면 시스템에 따라서 32비트 운영체제는 Int = Int32, 64비트 운영체제는 Int = Int64라고 한다.

Int64 구조체

MS 문서에 따르면 Int64의 범위는 다음과 같다.

Int64 는 음수 9,223,372,036,854,775,808(상수로 Int64.MinValue 표시됨)부터 양의 9,223,372,036,854,775,807(상수로 표현됨)까지의 값을 가진 부호 있는 정수를 나타내는 불변 값 Int64.MaxValue 형식입니다.

 

이미 예제 입력 두 값 중 첫 번째가 Int64의 맥스값, 두 번째가 맥스값을 초과하는 수였다.

 

그래서 선택한 방법은, 코드 주석과 같다.