문제 설명
자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.
제한 조건
입출력 예
n | return |
---|---|
12345 | [5,4,3,2,1] |
풀이 과정
- 자연수 n을 String()안에 넣어 문자열로 변환한다.
- reversed()를 사용해 문자열로 변환된 값을 뒤집어서 반환한다.
func solution(_ n:Int64) -> String {
let array = String(n)
return array.reversed()
}
Error
cannot convert return expression of type 'ReversedCollection' to return type 'String'
오류가 났다.
반환값의 타입을 String으로 지정해뒀는데
array.reversed() 를 사용하면 ReversedCollction 타입값이 반환된다고 한다.
지정해준 타입과 반환되는 타입이 달랐던 거였다.
문자열로 변환해 뒤집어준 값을 다시 String 타입으로 변환해주면 해결된다.
func solution(_ n:Int64) -> String {
let reverse = String(n).reversed()
let array = String(reverse)
return array
}
그!런!데! 오류는 아닌데, 한 가지 놓친 부분이 있었다.
정수 배열 형태로 반환해야 하는데, 문자열 그대로 반환해버렸다..!
어쩐지 처음에 return 값이 [Int]로 주어져 있더라..
멋대로 문자열로 바꾼 사람이 나예요..^..^ 잘 생각하자.
다시 돌아가서 반환 값을 다시 [Int]로 수정하고,
문자열로 만든 n을 뒤집어준 다음,
compactMap 함수를 사용해서 문자열의 각 요소들을 Int 값으로 변환 해주었다.
- 추가 설명
- String($0)은 문자열 각 요소들(Character)을 순회하고
- 이걸 Int() 안에 넣어서 정수 값으로 변환한다.
- 그리고 compactMap을 이용해 변환에 성공한 값들을 배열로 만들어준다.
Solution
func solution(_ n:Int64) -> [Int] {
let reverse = String(n).reversed()
let intArray = reverse.compactMap { Int(String($0)) }
return intArray
}
let sol = solution(1234)
print(sol)
//출력: [4, 3, 2, 1]
그리고 이걸 더 짧게 표현할 수 있다!
func solution(_ n:Int64) -> [Int] {
return String(n).reversed().compactMap { Int(String($0)) }
새로 알게 된 개념
고차함수 compactMap
Map에 Optional 개념이 추가되었다고 생각하면 된다!
compactMap은 배열의 각 요소에 접근해 요소들을 변환하는데,
변환에 실패해서 생성된 nil 값은 배열에 포함시키지 않고
변환에 성공한 값만 모아서 새로운 배열을 생성한다.
전 지난 문제들 우선 for문으로 전부 해결했는데 전부 다시 풀어봐야겠어요. 함수들로 간단하게 해결 가능한것들이 많은 것 같아요