[TIL][프로그래머스/Swift] 자연수 뒤집어 배열로 만들기

Eden·2024년 11월 3일
0

TIL

목록 보기
30/41
post-thumbnail

문제 설명

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

문제 접근 과정

주어진 숫자 n을 문자열로 변환한다. 그리고 문자열이 된 n을 한글자씩 쪼개서 for문을 사용하여 각 자릿수를 배열에 추가하려고 했다.

나한테 이게 좀 더 절차적인 접근 방식이었는데, 문자열의 각 문자를 순회하며 배열에 추가하는 방법으로 for문을 사용할 수 있었지만, map을 사용하는 것이 더 간결하고 효율적이었다.

문제 해결 과정

진짜최최최종코드

 func solution(_ n: Int64) -> [Int] {
     var arr: [Int] = String(n).map { Int(String($0))! }
     return Array(arr.reversed())
 }
  • 주어진 숫자 n을 문자열로 변환하고, 각 자릿수를 분해하여 배열로 만드는 과정을 진행 이때 String(n).map { Int(String($0))! }을 사용하여 숫자의 각 자릿수를 분해한 배열을 얻었다.
    • String(n): 숫자 n을 문자열로 변환
    • .map { Int(String($0))! }: 문자열의 각 문자를 순회하며 정수로 변환하는 과정
      • $0은 문자열의 각 문자(Character)를 의미한ㄷㅏ.
      • String($0): 각 문자를 문자열로 변환. (Swift에서는 Character를 직접 Int로 변환할 수 없으므로 문자열로 한 번 더 변환해야 한다.)
      • Int(String($0))!: 변환된 문자열을 정수로 변환. (!를 사용하여 강제 언래핑을 하기 때문에, 입력이 확실히 숫자임을 알고 있을 때 사용해야함.)
    • 이렇게 변환된 배열은 각 자릿수가 분리된 [Int] 형태로 된다.
      ex) "12345"[1, 2, 3, 4, 5]
  • 그 후 reversed()를 사용하여 배열의 순서를 뒤집는다.
  • Array()로 감싸서 배열 형태로 변환.

처음 제출했던 코드와 실수

  • 처음 제출했던 코드는 각 자릿수를 배열로 변환한 후, 배열의 길이를 이용해 단순히 1부터 a.count까지의 값을 배열에 추가하고, 그 배열을 뒤집는 방식이었다.
  • 실수한 점은 문제에서 요구하는 자연수의 각 자릿수를 뒤집는 작업을 제대로 반영하지 않았다는 것. 단순히 배열의 길이만큼 값을 추가하는 것이 아니라, 각 자릿수를 그대로 활용해야 했다.

처음에 for문을 사용하려고 했던 이유와 대안

  • 처음에는 for문을 사용하여 각 자릿수를 배열에 추가하려고 했었다. 문자열의 각 문자를 순회하며 배열에 추가하는 방법으로 for문을 사용할 수 있었지만, map을 사용하는 것이 더 간결하고 효율적이었다. 사실 코드 제출 했을 때 틀리지 않았더라면 이 방식으로 제출했을 것 같다. (테스트 성공 후 제출 때 왕창 에러남)

원래 목표였던 코드인 모양(수정 본)

 func solution(_ n: Int64) -> [Int] {
     var arr: [Int] = []
     let str = String(n)
     for char in str {
         if let digit = Int(String(char)) {
             arr.append(digit)
         }
     }
     return Array(arr.reversed())
 }
  • 여기서는 문자열 str의 각 문자를 돌면서, 각 문자를 정수로 변환하여 배열 arr에 추가. 이렇게 하면 map을 사용하지 않고도 동일한 결과를 얻을 수 있다.

배운 점

  • 문자열을 뒤집기 위해 문자열을 배열로 변환한 후 reversed()를 사용하고, 최종 결과를 배열로 다시 변환하는 방식이 필요하다는 점을 배웠다.
  • 배열을 뒤집을 때 reverse()는 반환값이 없고, reversed()는 새로운 컬렉션을 반환한다는 중요한 차이점을 알게 되었다. (근데 이럴거면 reverse()는 왜있는거지 ??)
  • 문제를 해결하면서, 문자열을 숫자 배열로 변환하는 과정에서 map { Int(String($0))! }을 사용하여 각 문자를 정수로 변환할 수 있다는 점을 알게 되었다.
  • mapfor문의 차이점을 이해하고, 코드의 간결성과 효율성을 고려하여 상황에 맞는 방식을 선택하는 것이 중요하다는 것을 깨달았다.

아무튼 해결하는 과정을 통해 성장했다. 근데 타입지정 매우 엄격해서 자바스크립트 쓰는 것 처럼 물렁하게 하면 안되는데 기강안잡혀있는거 완전 범죄다.

profile
Just living the daydream, one moment at a time.
post-custom-banner

0개의 댓글