[프로그래머스 | Swift | Lv.0] 이어 붙인 수

Juhee Kim·2025년 4월 29일

알고리즘 풀이

목록 보기
5/9

문제 링크


풀이 1: 반복문

import Foundation

func solution(_ num_list:[Int]) -> Int {
    var oddArr = num_list.filter { $0 % 2 == 1 }
    var evenArr = num_list.filter { $0 % 2 == 0 }
    var sumOfOdd = 0
    var sumOfEven = 0
    
    var square = Double(oddArr.count - 1)
    for n in oddArr {
        sumOfOdd += Int(Double(n) * pow(Double(10), square))
        square -= 1
    }
    
    square = Double(evenArr.count - 1)
    for n in evenArr {
        sumOfEven += Int(Double(n) * pow(Double(10), square))
        square -= 1
    }

    return sumOfOdd + sumOfEven
}

설명

  • filter를 사용해 홀수와 짝수를 별도의 배열로 분리

  • 10의 제곱을 사용해 각 배열의 숫자들을 자릿수에 맞게 변환

  • pow() 함수의 각 파라미터와 반환 타입은 Double 혹은 Float만 가능하므로 형변환 진행

    💡 각 배열 값(n)에도 명시적 형변환이 필요한 이유?
    Swift는 강한 타입(strongly typed) 언어로, 다른 타입 간의 자동 형변환을 허용하지 않는다.


다른 사람의 코드

import Foundation

func solution(_ num_list:[Int]) -> Int {
    let even = Int(num_list.filter { $0 % 2 == 0 }.map { String($0) }.joined())!
    let odd = Int(num_list.filter { $0 % 2 != 0 }.map { String($0) }.joined())!
    return even + odd
}

설명

  • .filter { $0 % 2 == 0 }: num_list에서 짝수만 필터링 → 배열 반환

  • .map { String($0) }: 각 숫자를 문자열로 변환 → 배열 반환

  • .joined(): 모든 문자열 이어붙이기.
    joined(separator: String = "") 형식이지만 separator 생략 가능

  • Int(...)!에서 강제 언래핑:
    형변환이 실패할 가능성이 있는 경우 Swift는 안전을 위해 옵셔널을 반환한다.

    💡 옵셔널 언래핑 두 가지 방법. ! vs ??
    !: 강제 언래핑(Force Unwrapping)
    값이 확실히 존재할 때만 사용한다.
    옵셔널이 nil일 때 강제 언래핑하면 런타임 오류가 발생한다.


    ??: Nil 병합 연산자
    안전하게 옵셔널을 처리할 수 있는 방법이다.
    왼쪽 피연산자가 nil이 아니면 그 값을 사용, nil이면 오른쪽 기본값을 사용한다.


    ?? 언래핑이 안전하지만, 문제의 조건에 num_list 배열의 요소는 항상 정수이기에 ! 언래핑을 사용했다.


filter 함수를 통해 홀수, 짝수 배열을 나누는 것까지는 생각했는데 Int 배열을 String으로 바꿔 문자열로 붙이는 생각을 못했다.
어쩐지 내 코드가 C언어스럽더라니... 다음엔 문자열로 변환 기억하기.

profile
개: 개롭지만 발: 발전하는중

0개의 댓글