👇🏻 Python 풀이
import sys
input = sys.stdin.readline
num = list(map, int(input().rstrip()))
print(sum(newnum))
이렇게 풀고 Swift로 옮겨보았다.
👇🏻Swift 풀이
import Foundation
func solution(_ n:Int) -> Int
{
let num = String(n).compactMap{Int(String($0))}
return num.reduce(0,+)
}
말이야 간단하게 써놓긴 했지만 옮기는 과정에서 시행착오가 많았다.
자료형 쓰는법이나 메서드 대소문자 같은게 파이썬이랑 달라서 아직도 안 익숙...
코드 설명
- 정수 n을 String으로 받으면 문자 배열로 바뀐다.
- 이를 nil을 허용하지 않는 compactMap으로 받아서, 각각 Int로 변환하여 num 리스트에 담는다.
- num 리스트의 합(합을 구하는 방법에 대한 포스트는 여기에)을 reduce로 구한다.
가장 이해되지 않는 부분이 Int로 변환할 때 String으로 한번 더 감싸는 부분이었는데, 이는 문자와 문자열 자료형에 대한 Python과 Swift의 차이에서 비롯된다.
Python에서는 문자와 문자열을 구분하지 않는다. 따라서 str 자료형을 list로 감싸면, 각각 개별 요소들이 str이 된다.
num = 1234
str_num = str(num) # 숫자를 문자열로 변환: "1234"
list_str = list(str_num) # 문자열을 리스트로 변환: ['1', '2', '3', '4']
위 예시에서 '1', '2', '3', '4' 각각의 자료형은 str 이 되는 것이다.
Swift에서는 문자열의 시퀀스를 String이라고 부르며, 단일 문자열을 character
라는 자료형으로 구분하여 처리한다.
let num = 1234
let strNum = String(num) // 숫자를 문자열로 변환: "1234"
let charactersArray = strNum.map { String($0) } // 문자열의 각 문자를 String 배열로 변환: ["1", "2", "3", "4"]
위 코드와 같이 "1234"를 map으로 처리할 경우, 각각의 요소가 String이 아닌 character 자료형으로 받아진다. 그런데 character를 Int로 바로 변환할 수 없기 때문에, String으로 한번 더 묶어준 후 변환해 주는 것.
이런걸 좀 기초부터 이해하며 차근차근 알아나가야 할 것 같다. 자유자재로 Swift 코드를 짜는 날이 빨리 오길!
다른 사람의 코드를 보던 중 클로저를 예술적으로 활용한 코드를 봤는데, 이를 남기며 글을 마무리한다.
return String(n).reduce(0, {$0 + Int(String($1))!})