๐ŸŽ iOS/Swift

[Swift] reduce ์‚ฌ์šฉํ•˜๊ธฐ | sum

Programmers ํ•˜์ƒค๋“œ ์ˆ˜๋ฅผ ํ’€๊ณ ๋‚˜์„œ, reduce๋ฅผ ์ด์šฉํ•œ ํ’€์ด๋ฅผ ๋งˆ์ฃผ์ณ๋ฒ„๋ ธ๋‹ค. 

// Programmers ํ•˜์ƒค๋“œ ์ˆ˜ ํ’€์ด
func solution(_ x:Int) -> Bool {

    var sum_x = String(x).map{ Int(String($0))! }.reduce(0, +)

    return x % sum_x == 0

}

ใ…‡ใ…‡.. ๋‚˜๋„ ๊ณต๋ถ€ํ•ด์ค„๊ฒŒ

reduce

์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€์˜ ๊ฐ’์„ ํ•˜๋‚˜๋กœ ํ†ตํ•ฉ(์—ฐ์‚ฐ)ํ•˜์—ฌ return

* Swift์—์„œ๋Š” Python๊ณผ๋Š” ๋‹ฌ๋ฆฌ ๋ฐฐ์—ด์˜ ์ด ํ•ฉ์„ ๊ตฌํ•˜๋Š” ๋‚ด์žฅ ํ•จ์ˆ˜ sum์ด ์—†๋‹ค. ๋Œ€์‹  reduce๋ฅผ ์‘์šฉํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

(1) reduce(_: _:)

public func reduce<Result>(_ initialResult: Result, 
_ nextPartialResult: (Result, Element) throws -> Result) rethrows -> Result
  • ํด๋กœ์ €๊ฐ€ ๊ฐ ์š”์†Œ๋ฅผ ์ „๋‹ฌ๋ฐ›์•„ ์—ฐ์‚ฐํ•œ ํ›„ ํด๋กœ์ € ์‹คํ–‰์„ ์œ„ํ•ด ๊ฐ’์„ ๋‹ค์‹œ ๋ฐ˜ํ™˜ํ•˜์—ฌ ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ˆœํ™˜
  • ์ฒซ ๋ฒˆ์งธ ์ธ์ž๋กœ ์ดˆ๊นƒ๊ฐ’์„ ์ง€์ •ํ•ด์ฃผ์–ด์•ผํ•œ๋‹ค.
let numbers: [Int] = [1, 2, 3]

var sum: Int = numbers.reduce(0, { (result: Int, element: Int) -> Int in
    print("\(result) + \(element)")
    // 0(=์ดˆ๊ธฐ๊ฐ’) + 1
    // 1(=0+1) + 2
    // 3(=1+2) + 3
    return result + element // ์ˆœํ™˜
})

print(sum)  // 6
// Closure ํ‘œํ˜„์‹์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ„๊ฒฐํ•˜๊ฒŒ ํ‘œํ˜„
var sum2: Int = numbers.reduce(0) {
    print("\($0) + \($1)")
  // 0 + 1
  // 1 + 2
  // 3 + 3
    return $0 + $1
}
print(sum2) // 6

 

reduce์˜ ์ฒซ๋ฒˆ์งธ ์ธ์ž 0์„ ์ง€์ •ํ•˜๋ฉฐ, result ๋‚ด์ง€ $0๋กœ ๊ฒฐ๊ณผ๊ฐ’์„ return ๋ฐ›์•„ ์ปจํ…Œ์ด๋„ˆ ๋‚ด๋ถ€๋ฅผ ์ˆœํ™˜ํ•˜๋Š” ๊ฒƒ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

 

(2) reduce(into:_:)

public func reduce<Result>(into initialResult: Result,
_ updateAccumulatingResult: (inout Result, Element) throws -> () rethrows -> Result)
  • ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์ˆœํ™˜ํ•˜์—ฌ ํด๋กœ์ €๊ฐ€ ์‹คํ–‰๋˜์ง€๋งŒ ํด๋กœ์ €๊ฐ€ ๋”ฐ๋กœ ๊ฒฐ๊ณผ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ. ๋Œ€์‹  inout ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ดˆ๊นƒ๊ฐ’์— ์ง์ ‘ ์—ฐ์‚ฐ ์‹คํ–‰
let numbers: [Int] = [1, 2, 3]

var sum = numbers.reduce(into: 0, { (result: inout Int, element: Int) in
    // 0 + 1
    // 1 + 2
    // 3 + 3
    print("\(result) + \(element)")
    result += element // !!ํด๋กœ์ € ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ!!
})
print(sum)  // 6

 

 

map vs reduce

: ๊ฐ™์€ ์‹คํ–‰ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค๋ฅธ ์ฝ”๋“œ๋กœ ํ‘œํ˜„ํ•ด๋ณด๊ธฐ

  • reduce(into:_:)๋กœ color ๊ฐ’์„ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜
let colors: [String] = ["orange", "yellow", "green", "blue", "purple"]

var rainbowColors: [String] = colors.reduce(into: [], {
  $0.append($1.uppercased())
})

print(rainbowColors) // ["ORANGE", "YELLOW", "GREEN", "BLUE", "PURPLE"]
  • map์œผ๋กœ color ๊ฐ’์„ ๋Œ€๋ฌธ์ž๋กœ ๋ณ€ํ™˜
let colors: [String] = ["orange", "yellow", "green", "blue", "purple"]

var rainbowColors: [String] = colors.map { $0.uppercased() }

print(rainbowColors) // ["ORANGE", "YELLOW", "GREEN", "BLUE", "PURPLE"]