[알고리즘] 자연수 뒤집어 배열로 만들기

이유진·2024년 3월 14일
0

알고리즘

목록 보기
17/32

문제 설명

자연수 n을 뒤집어 각 자리 숫자를 원소로 가지는 배열 형태로 리턴해주세요. 예를들어 n이 12345이면 [5,4,3,2,1]을 리턴합니다.


제한 조건

  • n은 10,000,000,000이하인 자연수입니다.

입출력 예

nreturn
12345[5,4,3,2,1]

풀이 과정

  1. 자연수 n을 String()안에 넣어 문자열로 변환한다.
  2. 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 값으로 변환 해주었다.

  • 추가 설명
    1. String($0)은 문자열 각 요소들(Character)을 순회하고
    2. 이걸 Int() 안에 넣어서 정수 값으로 변환한다.
    3. 그리고 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 값은 배열에 포함시키지 않고
변환에 성공한 값만 모아서 새로운 배열을 생성한다.

2개의 댓글

comment-user-thumbnail
2024년 3월 14일

전 지난 문제들 우선 for문으로 전부 해결했는데 전부 다시 풀어봐야겠어요. 함수들로 간단하게 해결 가능한것들이 많은 것 같아요

1개의 답글