Where who wants to meet someone
백준 Swift [10757] 큰 수 A+B 본문
728x90
난이도
브론즈 V
문제
https://www.acmicpc.net/problem/10757
내 답안
/*
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라고 한다.
MS 문서에 따르면 Int64의 범위는 다음과 같다.
Int64 는 음수 9,223,372,036,854,775,808(상수로 Int64.MinValue 표시됨)부터 양의 9,223,372,036,854,775,807(상수로 표현됨)까지의 값을 가진 부호 있는 정수를 나타내는 불변 값 Int64.MaxValue 형식입니다.
이미 예제 입력 두 값 중 첫 번째가 Int64의 맥스값, 두 번째가 맥스값을 초과하는 수였다.
그래서 선택한 방법은, 코드 주석과 같다.
'백준 알고리즘 문제 기록 > 일반 수학 1' 카테고리의 다른 글
백준 Swift [2869] 달팽이는 올라가고 싶다 (0) | 2023.07.01 |
---|