본문 바로가기

DEV

[iOS/Swift] Swift에서의 For문 (stride, filter, reduce, 범위)

반응형

 

 

아직 Swift에 대한 기초 문법 지식이 부족하다 느껴 swift로 코딩테스트 입문 문제를 풀어봤다.

그 중 짝수의 합 문제가 있었는데 사람들마다 풀이가 다양했다.

문제: 정수 n이 주어질 때, n이하의 짝수를 모두 더한 값을 return 하도록 solution 함수를 작성해주세요.

 

나의 풀이

func solution(_ n:Int) -> Int {
    
    var sum = 0
    
    for i in stride(from: 0, through: n, by:2) {
        sum += i
    }
    
    return sum
}

 

예전에 블로그를 보다가 stride가 생각나 python에서의 range(0, n, 2)처럼 구현하기 위해 이를 쓰려했지만, 정확한 문법이 기억이 안나서 다시 검색하여 공부를 했다.

 

Stride

stride는 한국어로 성큼성큼 걷다, 걸음걸이 라는 뜻을 가지고 있다. 

start 에서 end 까지 얼마만큼의 stride를 하며 반복을 할지를 생각하면 기억하기 편할 것 같다.

공식문서에서도 이처럼 나와있다.

stride(from:to:by:)

 

 

stride(from:to:by:)는 공식문서에서 보다시피 but not including, an end value라고 되어있어 끝 값을 포함하지 않는다. (start≤_<end)

이에 반해 stride(from:through:by:)끝 값을 포함한다. (start≤_≤end)

 

위 문제에서는 n이하라고 되어있어서 stride(from:through:by:)를 썼다.

 

그 후 다른 사람들의 풀이를 봤는데 처음 본게 있었다.

 

func solution(_ n: Int) -> Int {
    (1...n).filter { $0 % 2 == 0 }.reduce(0, +)
}

 

여기서 .filter는 본 적은 있지만 자세히는 모르고, .reduce는 처음 봤다.

 

filter

.filter는 배열이나 컬렉션과 같은 시퀀스에서 특정 조건(클로저)을 만족하는 요소들만 걸러내어 새로운 배열로 반환하는 고차 함수다.(데이터 필터링)

*고차함수: 다른 함수를 전달인자로 받거나 함수실행의 결과를 함수로 반환하는 함수

원본 배열은 수정되지 않고 필터링된 요소들로 구성된 새로운 배열을 반환한다.

 

array.filter { 조건 }

 

아래는 짝수만 필터링하는 예시 코드다.

let numbers = [1, 2, 3, 4, 5, 6]
let evenNumbers = numbers.filter { $0 % 2 == 0 }
print(evenNumbers)  // 출력: [2, 4, 6]

 

여기서 $0은 클로저에서 첫 번쨰 매개변수를 나타내는 축약 표현이다.

 

reduce

 

.reduce는 배열이나 시퀀스의 요소들을 하나의 값으로 결합하는 고차 함수이다. 주로 합계, 곱셈, 문자열 연결 등 반복적인 연산을 통해 단일 결과를 만들 때 사용된다.

 

array.reduce(초기값, 결합_클로저)

  • 초기값: 계산을 시작할 초기 값.
  • 결합_클로저: 두 값을 결합하는 방법을 정의한 클로저. $0는 현재 결과, $1은 다음 요소를 나타냅니다.

숫자 배열 합 예시

let numbers = [1, 2, 3, 4]
let sum = numbers.reduce(0, { $0 + $1 })
print(sum)  // 출력: 10

 

0: 초기값

{ $0 + $1 }: 현재 결과($0)와 다음 요소($1)를 더하는 클로저

동작:
 0 + 1 = 1
 1 + 2 = 3
 3 + 3 = 6
 6 + 4 = 10

 

연산자 축약 예시

let numbers = [1, 2, 3, 4]
let sum = numbers.reduce(0, +)
print(sum)  // 출력: 10

 

.reduce vs .reduce(into:)

.reduce: 단일 값을 반환.
.reduce(into:): 컬렉션(배열, 딕셔너리 등)을 반환하며, 중간 결과를 수정 가능

 

예시

let numbers = [1, 2, 3]
let doubled = numbers.reduce(into: []) { $0.append($1 * 2) }
print(doubled)  // 출력: [2, 4, 6]

 

 

for - in 범위 (..., ..<)

아마 이게 일반적인 정답 코드일 것 같다.

func solution(_ n:Int) -> Int {
    var sum = 0

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

 

자주 헷갈리는 for문 범위

  • start ... end -> end 포함
  • start ..< end -> end 포함 X

범위 연산자에 대해서는 아래 블로그에 잘 나와있다.

https://babbab2.tistory.com/165

 

Swift) 범위 연산자( a...b / a..<b / ...a / ~= )

안녕하세요~ 소들입니다!! 오늘은 간단한 Swift 문법에 대해 다뤄보려고 합니다 그있잖아여 for-in 반복문 돌리다 보면 보이는 0..

babbab2.tistory.com

 

 

반응형