Where who wants to meet someone

두 수의 합 본문

728x90

문제

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

 

프로그래머스

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

programmers.co.kr

 

내 답안 / 다른 사람들의 답안

import Foundation

func solution(_ a:String, _ b:String) -> String {
    var a = a.map { Int(String($0))! }
    var b = b.map { Int(String($0))! }

    var result = [Int]()
    var upNumber = 0

    if a.count < b.count {
        a = Array(repeating: 0, count: b.count - a.count) + a
    } else if a.count > b.count {
        b = Array(repeating: 0, count: a.count - b.count) + b
    }

    while !a.isEmpty {
        let sum = a.removeLast() + b.removeLast() + upNumber

        upNumber = sum / 10

        result.append(sum % 10)
    }

    if upNumber != 0 {
        result.append(upNumber)
    }

    return result.map { String($0) }.reversed().joined()
}

- 1) 과정의 편리함을 위해(10 이상의 수 체크 및 나머지 값 추가) a와 b를 Int의 배열로 변환

  2) 결과를 저장할 result, 10 이상의 수를 저장할 upNumber 프로퍼티 선언

  3) 한 숫자의 배열이 다른 숫자 배열보다 자릿수가 부족하다면 그만큼 0으로 채운 배열을 앞쪽에 추가하여 자릿수는 맞추되 값에 영향이
      없도록 처리

  4) 한 숫자의 배열이 비어있을 때까지 while문 내에서 각 배열의 마지막 값을 뽑아 덧셈 진행
       마지막 값들과 upNumber를 더하고, 더한 값을 10으로 나눈 몫을 upNumber에 저장하고, 나머지는 result에 append
  5) 이 과정이 모두 끝났는데 upNumber에 값이 남아있다면(!= 0) result에 추가
  6) result는 역순으로 되어있기 때문에 map을 통해 String으로 형변환을 하고 reversed를 해준 다음 joined를 해주어 String으로 반환

 

// 풀이 1
func solution(_ a: String, _ b: String) -> String {
    var result = ""
    var carry = 0
    var i = a.count - 1, j = b.count - 1
    let aArr = Array(a).map { Int(String($0))! }, bArr = Array(b).map { Int(String($0))! }

    while i >= 0 || j >= 0 || carry > 0 {
        var sum = carry

        if i >= 0 {
            sum += aArr[i]
            i -= 1
        }
        if j >= 0 {
            sum += bArr[j]
            j -= 1
        }
        result = "\(sum % 10)" + result
        carry = sum / 10
    }
    return result
}

// 풀이 2
import Foundation

func solution(_ a:String, _ b:String) -> String {
    var ans = Array(repeating: 0, count: max(a.count, b.count)+1)
    let (a, b) = (a.reversed().map{Int(String($0))!}, b.reversed().map{Int(String($0))!})

    for i in 0..<ans.count-1{
        let A = i < a.count ? a[i] : 0
        let B = i < b.count ? b[i] : 0
        ans[i+1] = (A+B+ans[i]) >= 10 ? 1 : 0
        ans[i] = (A+B+ans[i]) % 10
    }
    if ans.last! == 0 {
        ans.removeLast()
    }

    return ans.reversed().reduce("") { $0 + "\($1)"}
}

 

 

점수: +2