[Swift|코드카타] (프로그래머스) 입문 #13. 자릿수 더하기 - swift에 제곱 연산자(^) 없음 -> pow(_:_:) 활용
🔴 문제
(링크)
- 문제 설명 : 자연수 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() 또한 필요 없다.
코드가 훨씬 가벼워진다!!