Swift/Code Kata (알고리즘)

[Swift|코드카타] (프로그래머스) 입문 #13. 자릿수 더하기 - swift에 제곱 연산자(^) 없음 -> pow(_:_:) 활용

yurim-dev 2024. 2. 8. 00:32

🔴 문제

(링크)

  • 문제 설명 : 자연수 N이 주어지면, N의 각 자릿수의 합을 구해서 return 하는 solution 함수를 만들어 주세요.
    예를들어 N = 123이면 1 + 2 + 3 = 6을 return 하면 됩니다.
  • 제한사항 : N의 범위 : 100,000,000 이하의 자연수

 

 

🔵 풀이 1 > String으로 변환하여 인덱스 활용하기

import Foundation

func solution(_ n:Int) -> Int
{
    var strNum = String(n)
    var answer = 0
    
    for i in strNum {
        answer += Int(String(i))!
    }
    return answer
}

 

🛠️ 오류 발생 및 해결 

① Int(문자) 시 오류 발생

▶ 문제

위 코드 9번째 줄에서 answer += Int(String(i))! 대신 answer += Int(i) 라고 하면 오류가 난다.
왜 이미 문자(character) 상태인 i를 String으로 감싸주는걸까?

▶ 해결

 Int() 함수는 String형일 때만 씌울 수 있기 때문이다. (관련 내용)

 

② '!' 생략할 시 오류 발생

▶ 문제

느낌표(!)를 생략하면 오류가 난다.

▶ 해결

Int(String(i)) 의 결과로 optional int 가 나오기 때문에 계산이 불가하여 오류가 나는 것이다.  ex) Optional(3) 
그러므로, optional을 벗겨줘야 하는데,
느낌표(!)는 'forced unwrapping' 방법으로, optional을 강제적으로 제거하는 기능을 한다.

 

 

 

코드 보완 - reduce 활용 

reduce 함수를 String에도 사용할 수 있을 줄은 몰랐는데,

역시 reduce 함수를 사용하니 코드가 훨씬 간결해진다.

참고: reduce 함수 정리 (링크)

import Foundation

func solution(_ n:Int) -> Int
{
    return String(n).reduce(0, {$0+Int(String($1))!});
}

 

 

 


🔵 풀이 2 > 나누기 활용하기

n이 p자리 수라고 할 때,

1의 자릿수 = n % 10 / 1

2의 자릿수 = n % 100 / 10

...

p의 자릿수 = n % 10^p / 10^(p-1) 이므로,

 

각 자릿수를 구하는 식을 for...in 문을 사용해서 다음과 같이 구했다.

import Foundation

func solution(_ n:Int) -> Int {
    var len = String(n).count
    var sum = 0
    
    for i in 1...len {
        sum += n % Int(pow(10.0, Float(i))) / Int(pow(10.0, Float(i-1)))
    }
    return sum
}

 

 

🛠️ 오류 발생 및 해결 

▶ 문제 

for문 안의 코드를  sum += n % 10^i / 10^(i-1)  로 작성했더니 계속 오류가 났다.

알아보니, Swift에서는 '^' 연산자 사용이 안 되는 것으로 보인다.

 

해결 : 제곱근 함수인 pow를 사용하여 위처럼 문제를 해결했다.

 

 

코드 보완 - while 활용, 변수 업데이트

챗GPT에게 내 코드를 보여주니, 더 간단한 코드를 제안해주었다.

import Foundation

func solution(_ n: Int) -> Int {
    var num = n
    var sum = 0
    
    while num > 0 {
        sum += num % 10
        num /= 10
    }
    
    return sum
}

 

이렇게 num이 0이 될 때까지 while 루프를 돌게 만들면
-> String(n).count 사용할 필요 없고
-> power() 또한 필요 없다.

코드가 훨씬 가벼워진다!!