[Swift] [프로그래머스] 짝수의 합 - where

팔랑이·2024년 3월 26일

iOS/Swift

목록 보기
4/90
post-thumbnail

서론

Swift로 프로그래머스의 짝수의 합 이라는 문제를 푸는데, Swift가 아직 익숙치 않다 보니 좀 구질구질하게... 생각나는대로 풀었다.

👉🏻 첫 풀이

import Foundation

func solution(_ n:Int) -> Int {

    var num = n
    var sum = 0

    if num % 2 == 1 {
        num -= 1
    }

    while num > 0 {
        sum += num
        num -= 2
    }

    return sum
}

조건문으로 풀면 되는걸 구질구질하게 풀었다 싶어서 다른 사람의 풀이를 보는데,
SQL에서만 봤던 whereWHERE을 사용하고 있는 것이 아닌가.

👉🏻 Where을 사용한 풀이

import Foundation

func solution(_ n:Int) -> Int {

    var sum = 0

    for i in 1...n where i % 2 == 0 {
        sum += i
    }
    
    return sum
}

if 문을 한번 더 쓰지 않고 where이라는 절을 사용하여 간결하게 코드를 끝냈길래, Swift에서는 where를 어떻게 쓰는지 궁금해서 찾아보게 되었다.


본론: where in Swift

Swift에서 where을 쓰는 여러 경우를 살펴보자.

1. for-in 조건문에서 각 반복을 위한 추가 조건을 명시하는 데 사용

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

for number in numbers where number % 2 == 0 {
    print(number)
}

특정 조건을 만족하는 요소에 대해서만 반복문 안의 본문이 실행되도록 할 수 있다.

2. Switch-case 문에서의 사용

Swift의 Switch-case 문에서, case에 조건을 추가할 때 where을 사용하여 더 세밀한 분기를 할 수 있다.

let somePoint = (1, 1)

switch somePoint {
case let (x, y) where x == y:
    print("x와 y가 같은 경우")
case let (x, y) where x == -y:
    print("x와 y가 서로 반대인 경우")
case (_, _):
    print("그 외의 경우")
}

3. 제네릭에서의 사용

제네릭을 잘모르는대 대충 범용 타입이라는 느낌인 것 같다. 일단 차차 공부하기로 하고 느낌만 가져가보자.

💻 출처: 서근 개발노트 - Tistory
Swift에는 제네릭이라는 범용 타입이 있다. 배열(Array), 딕셔너리(Dictionary), 세트(Set) 도 제네릭이며, Int나 String등도 제네릭으로 변환하여 사용할 수 있다. Apple에 의하면 제네릭을 사용해 코드를 구현하면, 아주 유연하고 재사용성 높은 코드를 작성할 수 있다고 한다. 또, 제네릭으로 구현한 기능과 타입은 재사용하기도 쉽고, 중복을 줄일 수 있기 때문에 깔끔하고 추상적인 표현이 가능하다.

무튼 이 제네릭을 사용할 때, 타입 제약 조건으로 where을 사용할 수 있다고 한다.

4. 프로토콜 익스텐션에서의 활용

Swift는 개발 과정에서 여러 프로토콜을 채택하고, 이를 extension으로 끌어와 조건을 추가할 수 있는 것 같다. 아직 프로토콜을 잘 몰라서 예시만 일단 남겨둔다.

protocol Container {
    associatedtype Item
    mutating func append(_ item: Item)
    var count: Int { get }
    subscript(i: Int) -> Item { get }
}

// Sequence 프로토콜을 준수하고, Iterator의 Element가 Equatable을 준수하는 경우에만
// Extension이 적용되도록 함
extension Container where Item: Equatable {
    func startsWith(_ item: Item) -> Bool {
        return count >= 1 && self[0] == item
    }
}

결론

Swift로 기초부터 풀어보고 있는데, 문법이랑 타입 지정하고 이런게 아직 익숙치가 않다. 정규기간까지 열시미 공부해서 정규수업 잘 따라잡아야겠다.

profile
정체되지 않는 성장

0개의 댓글