λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°

🍎 iOS/Swift

[Swift] κ³ μ°¨ν•¨μˆ˜ - map, filter, reduce

728x90

κ³ μ°¨ν•¨μˆ˜?

ν•˜λ‚˜ μ΄μƒμ˜ ν•¨μˆ˜(ν΄λ‘œμ €)λ₯Ό 인자 둜 λ°›κ±°λ‚˜, ν•¨μˆ˜(ν΄λ‘œμ €)λ₯Ό λ°˜ν™˜ ν•˜λŠ” ν•¨μˆ˜λ‘œ

λ°˜λ³΅λ¬Έμ„ μ‚¬μš©ν•˜μ—¬ κ΅¬ν˜„μ„ ν•  수 μžˆμ§€λ§Œ μƒμˆ˜λ₯Ό μ‚¬μš©ν•˜λ©΄ λ˜μ–΄μ„œ λ©”λͺ¨λ¦¬ μžμ›μΈ‘μ—μ„œ 더 효율적으둜 μ‚¬μš©ν•  수 μžˆλ‹€.

λ˜ν•œ, 반볡문으둜 κ΅¬ν˜„ν•˜κ²Œ 되면 가독성이 떨어지고 λ³΅μž‘ν•΄μ§€κΈ° λ•Œλ¬Έμ—, 가독성을 올리고 νŽΈλ¦¬μ„±μ„ 높이기 μœ„ν•΄μ„œ μ‚¬μš©.

 

κ·Έ 쀑, λ°°μ—΄ λ‹€λ£°λ•Œ κ°€μž₯ μ€‘μš”ν•œ μ„Έ 가지 map, filter, reduce에 λŒ€ν•΄ μ•Œμ•„λ³΄μž


πŸ”₯ map

: κΈ°μ‘΄ 데이터 λ³€ν˜•ν•˜μ—¬ μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆλ₯Ό λ§Œλ“€ λ•Œ μ‚¬μš©

μ»¬λ ‰μ…˜ νƒ€μž…μ„ 순회(forλ¬Έ μ‚¬μš©)ν•  ν•„μš” 없이 κ°„λ‹¨ν•˜κ²Œ κ΅¬ν˜„ κ°€λŠ₯!

// Declaration
func map<U>(transform: (T) -> U) -> Array<U>

 

[간단 μ‚¬μš©μ˜ˆμ œ] λ°°μ—΄ μ›μ†Œ 데이터 ν˜•λ³€ν™˜ν•˜κΈ°

var string = ["1","2","3","4"]
string.map { Int($0)! } // [1,2,3,4] 각 μ›μ†Œλ₯Ό μ „λΆ€ Int둜 맡핑

 

 

[문제] - λ°°μ—΄μžλ₯΄κΈ°

μ •μˆ˜ λ°°μ—΄ numbers와 μ •μˆ˜ num1, num2κ°€ λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§ˆ λ•Œ, numbers의 num1번 μ§Έ μΈλ±μŠ€λΆ€ν„° num2번째 μΈλ±μŠ€κΉŒμ§€ 자λ₯Έ μ •μˆ˜ 배열을 return ν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄λ³΄μ„Έμš”.

 

[forλ¬Έ μ‚¬μš©]

func solution(_ numbers:[Int], _ num1:Int, _ num2:Int) -> [Int] {
	var newArr: [Int] = []
	for i in (num1...num2){
		newArr.append(numbers[i])
	}
	return newArr
}

[map λ©”μ†Œλ“œ μ‚¬μš©]

func solution(_ numbers:[Int], _ num1:Int, _ num2:Int) -> [Int] {
    return (num1...num2).map{numbers[$0]}
}

ν΄λ‘œμ € μΆ•μ•½ 문법을 μ‚¬μš©ν•΄μ„œ 훨~씬 κ°„κ²°ν•˜κ²Œ μ½”λ“œ κ΅¬ν˜„μ΄ κ°€λŠ₯


πŸ”₯ filter

: κΈ°μ‘΄ κ°’λ“€ 쀑 쑰건에 λ§Œμ‘±ν•˜λŠ” 값을 μΆ”μΆœν•˜μ—¬ μƒˆλ‘œμš΄ μ»¨ν…Œμ΄λ„ˆλ‘œ λ°˜ν™˜, μš”μ†Œκ°€ λ°˜ν™˜λœ 배열에 ν¬ν•¨λ˜μ–΄μ•Ό ν•˜λŠ”μ§€ μ—¬λΆ€λ₯Ό Bool κ°’μœΌλ‘œ λ°˜ν™˜ν•˜λŠ” ν΄λ‘œμ €

// Declaration
func filter(includeElement: (T) -> Bool) -> Array<T>

 

[간단 μ‚¬μš©μ˜ˆμ œ]

var array = [1,2,3,4]
array.filter { $0 % 2 == 0 } // [2,4] 쑰건에 λ§žλŠ” 수만 뽑아냄

 

 

[문제] - νŠΉμ • 문자 μ œκ±°ν•˜κΈ°

λ¬Έμžμ—΄ my_stringκ³Ό 문자 letter이 λ§€κ°œλ³€μˆ˜λ‘œ μ£Όμ–΄μ§‘λ‹ˆλ‹€. my_stringμ—μ„œ letterλ₯Ό μ œκ±°ν•œ λ¬Έμžμ—΄μ„ returnν•˜λ„λ‘ solution ν•¨μˆ˜λ₯Ό μ™„μ„±ν•΄μ£Όμ„Έμš”.

 

[forλ¬Έ μ‚¬μš©]

func solution(_ my_string:String, _ letter:String) -> String {
	var my_array = Array(my_string)
	var new_array: [Character] = []
        
	for char in my_array{
		if char != Character(letter){
			new_array.append(char)
		}
	}
	return String(new_array)
}

[filter μ‚¬μš©]

func solution(_ my_string:String, _ letter:String) -> String {
	return my_string.filter{String($0) != letter}
}

πŸ”₯ reduce

: κΈ°μ‘΄ μ»¨ν…Œμ΄λ„ˆμ—μ„œ λ‚΄λΆ€μ˜ 값듀을 κ²°ν•©ν•˜μ—¬ μƒˆλ‘œμš΄ 값을 λ§Œλ“ λ‹€.

λ°°μ—΄μ˜ 각 ν•­λͺ©λ“€μ„ μž¬κ·€μ μœΌλ‘œ ν΄λ‘œμ €λ₯Ό μ μš©μ‹œμΌœ ν•˜λ‚˜μ˜ 값을 λ§Œλ“¬.

func reduce<U>(initial: U, combine: (U, T) -> U) -> U

[간단 μ‚¬μš©μ˜ˆμ œ]

var array = [1,2,3,4]
array.reduce(0, +) // 숫자 합이 λ‚˜νƒ€λ‚¨. λ¬Έμžμ—΄ ν•©μΉ˜κΈ°λ„ κ°€λŠ₯

 

[문제] - λ°°μ—΄ μ›μ†Œλ“€μ˜ ν•© κ΅¬ν•˜κΈ°

[forλ¬Έ μ‚¬μš©]

let numberArray = [1,2,3,4,5,6,7,8,9,10]
var sum = 0
for number in numberArray {
    sum += number
}
print(sum)

[filter μ‚¬μš©]

let array = [5,6,7,8]
array.reduce(0, +)

//λ‹€λ₯Έ 연산도 κ°€λŠ₯
array.reduce(0, -)

// (1) * (5*6*7*8)
array.reduce(1, *)

// (16800) / (5 /6 /7 /8) = 10
array.reduce(16800, /))
λ°˜μ‘ν˜•