[Programming Language]/[Swift]

[Swift] 코딩 테스트에서 자주 쓰이는 max, min, zip, filter, reduce

Semincolon 2024. 7. 13. 09:25

[머릿말]

코딩 테스트를 풀다보면 코딩 테스트에서 많이 사용되는 여러 함수가 있는 것 같다. 이 함수들을 사용하지 않고도 해결은 가능하지만 존재하는 것들을 잘 사용하면 더 편리하고 빠르게 해결할 수 있으니 이런 부류의 함수들은 잘 알아두는 것이 좋을 것 같다.


1. max( )

1-1. max(_:_:)

max(_:_:) 함수에 대한 공식 문서에서의 내용은 다음과 같다.

 

❗️

func max<T>(
    _ x: T,
    _ y: T
) -> T where T : Comparable

Returns the greater of two comparable values.

 

Parameters

  • x: A value to compare.
  • y: Another value to compare.

Return Value

The greater of x and y. If x is equal to y, returns y.

❗️

 

max 함수는 이름 그대로 최댓값을 찾을 때 사용한다.같은 타입의 값을2개 이상 사용하면 그 중 최댓값을 찾아서 반환한다.

print(max(10, 20)) // 20

print(max(5.0, 2.0)) // 5.0

print(max("A", "B")) // B

print(max(1, 2, 3, 4, 5)) // 5

 

1-2. max( )

❗️

@warn_unqualified_access
func max() -> Self.Element?

Returns the maximum element in the sequence.

 

Return Value

The sequence's maximum element. If the sequence has no elements, returns nil.

❗️

 

배열, 집합에 사용 가능한 max( ) 함수는 해당 컬렉션에서의 최댓값을 반환한다. 만약 요소가 하나도 존재하지 않는다면 nil 값을 반환한다. 그렇기 때문에 이 함수의 반환 타입은 Optional이다.

let arr1 = [1, 2, 3, 4, 5]
let arr2 = [Int]()
let set1: Set = ["A", "D", "E", "B", "F"]

print(arr1.max()) // Optional(5)
print(set1.max()) // Optional("F")

print(arr2.max()) // nil

 

 

2. min( )

2-1. min(_:_:)

❗️

func min<T>(
    _ x: T,
    _ y: T
) -> T where T : Comparable

Returns the lesser of two comparable values.

 

Parameters

  • x: A value to compare.
  • y: Another value to compare.

Return Value

The lesser of x and y. If x is equal to y, returns x.

❗️

 

max 함수가 최댓값을 반환했다면 min 함수는 최솟값을 반환한다. 같은 타입의 2개 이상의 요소에 대한 최솟값을 반환한다.

print(min(10, 20)) // 10

print(min(5.0, 2.0)) // 2.0

print(min("A", "B")) // A

print(min(1, 2, 3, 4, 5)) // 1

 

2-2. min( )

❗️

@warn_unqualified_access
func min() -> Self.Element?

Returns the minimum element in the sequence.

 

Return Value

The sequence's minimum element. If the sequence has no elements, returns nil.

❗️

 

배열, 집합에 사용 가능했던 max( ) 함수와 동일하게 min( ) 함수 역시 배열, 집합의 최솟값을 반환한다. 요소가 존재하지 않을 경우 nil을 반환하는 것도 동일하다. 그러므로 반환 타입은 Optional인 것 역시 동일하다.

let arr1 = [1, 2, 3, 4, 5]
let arr2 = [Int]()
let set1: Set = ["A", "D", "E", "B", "F"]

print(arr1.min()) // Optional(1)
print(set1.min()) // Optional("A")

print(arr2.min()) // nil

 

 

3. zip(_:_:)

❗️

func zip<Sequence1, Sequence2>(
    _ sequence1: Sequence1,
    _ sequence2: Sequence2
) -> Zip2Sequence<Sequence1, Sequence2> where Sequence1 : Sequence, Sequence2 : Sequence

Creates a sequence of pairs built out of two underlying sequences.

 

Parameters

  • sequence1: The first sequence or collection to zip.
  • sequence2: The second sequence or collection to zip.

Return Value

A sequence of tuple pairs, where the elements of each pair are corresponding elements of sequence1 and sequence2.

❗️

 

zip 함수는 두 컬렉션의 각각의 요소들을 1:1 매칭시킨 튜플로 만들어준다. 결과는 for ~ in 반복문을 통해 확인할 수 있다.

let dict1 = ["name": "semin", "city": "Won-ju"]
let arr1 = [10, 20]
let set1: Set = ["A", "B"]

let zipped1 = zip(dict1, arr1)
for i in zipped1 {
    print(i)
}
/*
 ((key: "city", value: "Won-ju"), 10)
 ((key: "name", value: "semin"), 20)
 */

let zipped2 = zip(arr1, set1)
for i in zipped2 {
    print(i)
}
/*
 (10, "A")
 (20, "B")
 */

 

만약 위 예제와 달리 요소의 개수가 다른 컬렉션을 zip 하게 된다면 요소가 작은 컬렉션의 모든 요소가 사용될 때까지만 zip이 이뤄진다.

let arr1 = [1, 2, 3]
let arr2 = ["A", "B", "C", "D", "E"]

let zipped = zip(arr1, arr2)
for i in zipped {
    print(i)
}

/*
 (1, "A")
 (2, "B")
 (3, "C")
 */

 

문자열에 대한 zip 연산도 가능하다.

let zipped = zip("HELLO", "SWIFT")
for i in zipped {
    print(i)
}

/*
 ("H", "S")
 ("E", "W")
 ("L", "I")
 ("L", "F")
 ("O", "T")
 */

 

 

4. filter(_:)

❗️

func filter(_ isIncluded: (Self.Element) throws -> Bool) rethrows -> Self

Returns a new collection of the same type containing, in order, the elements of the original collection that satisfy the given predicate.

 

Parameters

  • isIncluded: A closure that takes an element of the sequence as its argument and returns a Boolean value indicating whether the element should be included in the returned collection.

Return Value

A collection of the elements that isIncluded allowed.

❗️

 

filter 함수는 컬렉션에 대해 설정한 조건을 만족하는 요소만을 포함한 새로운 컬렉션을 반환한다. 예를 들어 정수형 배열에서 10보다 작은 수만을 포함하는 배열을 얻는 상황 등에 사용한다. 매개변수로는 Closure를 받는다.

let arr = [1, 2, 3, 4, 5, 11, 12, 13, 14, 15]

print(arr.filter({ (a: Int) -> Bool in a < 10 })) // [1, 2, 3, 4, 5]
print(arr.filter { $0 > 10 }) // (Closure의 축약형) // [11, 12, 13, 14, 15]

 

 

5. reduce(_:_:)

❗️

func reduce<Result>(
    _ initialResult: Result,
    _ nextPartialResult: (Result, Self.Element) throws -> Result
) rethrows -> Result

Returns the result of combining the elements of the sequence using the given closure.

 

Parameters

  • initialResult: The value to use as the initial accumulating value. initialResult is passed to nextPartialResult the first time the closure is executed.
  • nextPartialResult: A closure that combines an accumulating value and an element of the sequence into a new accumulating value, to be used in the next call of the nextPartialResult closure or returned to the caller.

Return Value

The final accumulated value. If the sequence has no elements, the result is initialResult.

❗️

 

reduce 함수는 배열, 집합에 대한 특정 연산의 누적 값을 구할 때 사용한다. 요소의 전체 합 등을 계산할 때 많이 사용된다. 매개변수는 2개이며, 첫 번째 매개변수는 초깃값을 뜻한다. 별도의 초깃값이 필요하지 않은 경우가 대부분이므로 0을 입력하면 된다. 두 번째 매개변수는 Closure로써 실행할 연산을 입력하면 된다. 만약 빈 Sequence라면 초깃값을 반환한다.

let arr = [1, 2, 3, 4, 5]

print(arr.reduce(0, { (a: Int, b: Int) -> Int in a+b })) // 15
print(arr.reduce(0, +)) // (위 형태의 축약형, 결과는 동일) // 15

print([].reduce(100, +)) // 빈 sequence이므로 초깃값 100 반환 // 100

이 함수들은 전부 굳이 모르더라도 직접 구현하여 사용할 수 있는 함수들이다.

그러나 이미 존재하는 것들을 사용하면 코드도 간결해지고 속도도 빨라지므로 적절하게 잘 활용하면 좋을 것 같다.

 

끝!