[Swift][프로그래머스] 배열의 평균값 - reduce()

팔랑이·2024년 3월 27일
0

iOS/Swift

목록 보기
5/71
post-thumbnail

서론

💻 프로그래머스: 배열의 평균값 - 문제 링크

평균값을 구해야 하는데, avg나 적어도 sum이 아예 안먹혀버리는 것이다.
찾아봤더니 reduce() 메서드를 사용하면 된다고.
사실 반복문 사용해도 되긴 하는데 편해보이길래 가져와봤다.

본론

reduce() 메서드

  • 컬렉션(배열, 집합, 딕셔너리)의 요소를 하나의 값으로 결합하기 위해 사용한다.
  • 컬렉션의 요소들을 순회하며, 주어진 클로저를 통해 요소를 하나의 값으로 축약한다.

reduce의 두 가지 인자

  1. initialResult: 축약을 시작하기 위한 초기값이며, 최종 축약 결과의 타입도 결정한다.
  2. nextPartialResult: 클로저(Closure)로, 이전까지의 축약 결과와 컬렉션의 다음 요소를 받아 새로운 축약결과를 반환한다.

사용 예시

여러 사용 예시를 통해 사용법을 알아보자.

1️⃣ 정수 배열의 합: 프로그래머스 - 배열의 평균값 코드

import Foundation

func solution(_ numbers:[Int]) -> Double {
    let sum = Double(numbers.reduce(0,+))
    let len = Double(numbers.count)
    return sum / len
}
  • reduce의 첫 번째 인자 '0': python에서 sum = 0 으로 변수 선언해주고 시작하는 거랑 비슷한 느낌으로 0에 이후 값들을 더한다는 의미이다.

  • reduce의 두 번째 인자 '+': 이후 값을 더한다는 뜻의 축약형 클로저.

비슷하게 배열의 곱을 구하고자 한다면,

let a = numbers.reduce(1, *)

와 같이 쓸 수 있겠다.

❗️ 참고로 swift에서 배열의 길이를 구하고 싶다면 len(array)가 아닌 array.count를 사용하면 된다.

2️⃣ 문자열 배열을 하나의 문자열로 결합

let words = ["Swift", "is", "awesome"]
let sentence = words.reduce("") { $0 + " " + $1 }.trimmingCharacters(in: .whitespaces)
print(sentence) // "Swift is awesome"
  • 위 코드의 경우, $0 에서는 초기값 또는 축적값을 받고, $1은 배열에서 현재 처리중인 요소를 가져오는 방식으로 두 개의 인자를 이용하고 있다.

  • 뒤의 trimmingCharacters은 문자열 전후의 공백을 지워주는 역할!

위 배열의 평균값 예시처럼, reduce() 안에 두 개의 인자를 모두 입력해도 된다.

let sentence = words.reduce("", { $0 + " " + $1 })

그러나 뒤의 클로저가 길어질 경우, 해당 예시처럼 뒤로 빼기도 한다고 한다.

❗️ 클로저는 여기에서 간단하게 느낌만 알고 넘어갔지만 써 본 적이 아직 별로 없기때문에 익숙해져야 한다!!

클로저 내에서는 $0, $1 과 같은 단축 인자 이름을 사용한다.

  • 두 개의 인자를 이용할 경우, 클로저에 전달된 첫 번째 인자를 $0, 두 번째 인자를 $1로 받아 처리한다.
  • 여러 인자가 있는 경우, 첫 번째 인자를 $0, 두 번째 인자를 $1, 세 번째 인자를 $2... 등으로 받기도 한다.

이쯤 이해하니 뒤의 예시들은 보면 아!하고 이해가 잘 된다.

3️⃣ 배열 내의 최대값 찾기

let numbers = [3, 5, 1, 6, 2, 7, 4]
let maxNumber = numbers.reduce(numbers[0]) { $0 > $1 ? $0 : $1 }
print(maxNumber)

4️⃣ 배열 요소들의 조건부 처리

let numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
let evenSum = numbers.reduce(0) { $1 % 2 == 0 ? $0 + $1 : $0 }
print(evenSum)

결론

swift의 reduce()에 대해 알아보았는데, 클로저의 단축 인자에 대해 더 이해하게 되는 계기가 되었다.

profile
정체되지 않는 성장

0개의 댓글