[Swift] ๊ณ ์ฐจํจ์ - map, filter, reduce
๊ณ ์ฐจํจ์?
ํ๋ ์ด์์ ํจ์(ํด๋ก์ )๋ฅผ ์ธ์ ๋ก ๋ฐ๊ฑฐ๋, ํจ์(ํด๋ก์ )๋ฅผ ๋ฐํ ํ๋ ํจ์๋ก
๋ฐ๋ณต๋ฌธ์ ์ฌ์ฉํ์ฌ ๊ตฌํ์ ํ ์ ์์ง๋ง ์์๋ฅผ ์ฌ์ฉํ๋ฉด ๋์ด์ ๋ฉ๋ชจ๋ฆฌ ์์์ธก์์ ๋ ํจ์จ์ ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค.
๋ํ, ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํํ๊ฒ ๋๋ฉด ๊ฐ๋ ์ฑ์ด ๋จ์ด์ง๊ณ ๋ณต์กํด์ง๊ธฐ ๋๋ฌธ์, ๊ฐ๋ ์ฑ์ ์ฌ๋ฆฌ๊ณ ํธ๋ฆฌ์ฑ์ ๋์ด๊ธฐ ์ํด์ ์ฌ์ฉ.
๊ทธ ์ค, ๋ฐฐ์ด ๋ค๋ฃฐ๋ ๊ฐ์ฅ ์ค์ํ ์ธ ๊ฐ์ง 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, /))