TIL/알고리즘 공부

백준 10757번 Swift 알고리즘 연습

여의도사노비 2022. 8. 28. 17:19
728x90

두 값을 입력받고 두 값을 더한 값을 리턴하는 문제이다.

문제는 단순 그 자체.. 심지어 단계 레벨도 브론즈 5인데..

이게 아마 사용하는 언어마다 난이도 차이가 갈리는 것 같다. Python의 경우 큰 Int 값을 자동으로 변환해주는 기능이 있다고 하더라(?)

근데 Swift는 Int나 UInt 만으로 계산이 안되어버려서 String -> Int 변환 과정이 필요한 것 같다.

 

이 문제를 풀면서 생각한 논리적 흐름은

  1. String으로 값을 받고 각 배열에 저장한다.
  2. 각 자릿수를 맞춰주기 위해 & 추후 String끼리 값을 더하고 10이 넘어가는 경우 다음자리수에 1을 추가해주기 위해 reversed한다.
  3. reversed 후 a와 b의 자릿수를 비교해주고 더 작은 자리수를 가지고 있는 문자열에 그 수 만큼 0을 더해준다.
  4. 이제 reversed 되어 있는 상태에서 [0], [1] ... 의 각 위치마다 String 값을 Int로 변환해 더해준다.
  5. 이때 10을 넘는 값이 나온다면 숫자를 저장해두고 다음 위치를 계산할 때 더해준다. (one의 역할)
  6. 마지막 값의 경우 더한 그대로의 값을 반영해주고, 그 전까지의 값들에는 10으로 나눈 나머지들만을 더해준다.
  7. 다시 reserved 후 join을 통해 string을 하나의 string으로 합쳐준다.

이 문제는 사실상 타 블로거 분의 글을 보고 풀었다...(너무 오래 고민해서 그냥 답을 봐버렸다 ㅠㅠ)

(출처: https://fomaios.tistory.com/entry/Swift-Baekjoon-%ED%81%B0-%EC%88%98-A-B)

진짜 설명을 너무 깔끔하게 잘해주신것 같다.

언제쯤 이렇게 깔끔하고 쉽게 문제를 풀 수 있을지..!

 

 

* 10757번


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

var a = Array(inputArr[0].map{String($0)}.reversed())
var b = Array(inputArr[1].map{String($0)}.reversed())

var isALong = a.count > b.count
let addZero = Array(repeating: "0", count: abs(a.count-b.count))

a = isALong ? a : a + addZero
b = isALong ? b + addZero : b

var one = 0
var answer:[String] = []
let count = isALong ? a.count : b.count

for i in 0..<count {
    let sum = Int(a[i])! + Int(b[i])! + one
    one = sum/10
    if i == count - 1 {
        answer.append(String(sum))
    }else {
        answer.append(String(sum%10))
    }
}

print(Array(answer.reversed()).joined())

 

 

정리(Today I Learned)

  1. 배열안에 있는 String을 합쳐줄때 joined() 메서드를 쓴다! (Split이 존재하듯이 join도 존재한다!)