🔴 문제
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
제한 조건
n은 10,000,000,000이하인 자연수입니다
🔵 풀이 1
temp 변수에 Int 타입으로 변환한 n값을 넣고,
temp가 0이 될 때까지 1) temp를 10으로 나눈 나머지를 digits 리스트에 넣고 2) temp를 10으로 나누는 코드이다.
func solution(_ n:Int64) -> [Int] {
guard n > 0 else { return [] }
var temp: Int = Int(n)
var digits: [Int] = []
while temp > 0 {
digits.append(temp % 10)
temp /= 10
}
return digits
}
🔵 풀이 2. compactMap, reversed(), hexDigitValue, wholeNumberValue
아래는 다른 사람이 compactMap을 활용하여 한 줄로 작성한 코드이다.
func solution(_ n:Int64) -> [Int] {
return "\(n)".compactMap { $0.hexDigitValue }.reversed()
}
○ compactMap은 고차함수 map의 시리즈 함수로, non-nil 형태의 배열을 반환하는 함수이다.
>> 정리 : [Swift] 고차함수 - map 시리즈(map, flatMap, compactMap)
○ hexDigitValue는 문자(character)가 16진수일 때 이 프로퍼티의 값은 문자가 가리키는 숫자값이다. 아닐 경우 nil이다.
* 16진수는 0-9, a-f, A-F 및 전체 너비 호환 형식이 포함됨.
(참고: apple 공식 문서)
[더보기] 클릭
더보기
let chars: [Character] = ["1", "a", "F", "g"]
for ch in chars {
print(ch, "-->", ch.hexDigitValue)
}
// Prints:
// 1 --> Optional(1)
// a --> Optional(10)
// F --> Optional(15)
// g --> nil
그런데 주어지는 숫자가 10진수일테니,
16진수의 숫자값을 반환하는 hexDigitValue 프로퍼티를 사용하기보다는
문자를 whole number(0 또는 자연수)로 변환하는 wholeNumberValue를 사용하는 게 더 좋을 것 같다.
func solution(_ n:Int64) -> [Int] {
return "\(n)".compactMap { $0.wholeNumberValue }.reversed()
}