ios개발/함수형 프로그래밍
<함수형 프로그래밍> 백준 11502번
studying develop
2020. 6. 8. 00:06
이번에는 이차원 배열을 함수형 프로그래밍으로 구현해보자.
첫 구현은 실패해서 일단 스위프트로 구현하는 것에 의의를 두고 통과한 코드이다.
import Foundation
var maxCache = [Int:Int]()
let n = Int(readLine()!)
//print(n)
//text = x?.split(separator: " ")
for i in 0 ..< n! {
maxCache[i] = 0
}
let int_list = [0] + (readLine()?.components(separatedBy: " ").map({ (val : String) -> Int in return (Int(val)!)}))!
//let tmp = readLine()?.components(separatedBy: " ").map({ (val : String) -> Int in return (Int(val)!)})
maxCache[n!] = 0
maxCache[0] = int_list[0]
//print(int_list)
let enum_list = int_list.enumerated()
func getMax(x : Int, y : Int ) -> Int {
return x > y ? x : y
}
for x in 0 ..< n! + 1 {
for y in 0 ..< x {
if y < x{
//print("x : \(x), y: \(y)")
maxCache[x] = getMax(x: int_list[x - y] + maxCache[y]!, y: maxCache[x]!)
//print("maxCache[x] : \(maxCache[x])")
}
}
}
print(maxCache[n!]!)
이제 이중 반복문을 flatMap을 통해 구현해보자. 이걸 함수형 프로그래밍으로 구현한 사람은 없는거 같다.!!
import Foundation
var maxCache = [Int:Int]()
let n = Int(readLine()!)
for i in 0 ..< n! + 1 {
maxCache[i] = 0
}
let int_list = [0] + (readLine()?.components(separatedBy: " ").map({ (val : String) -> Int in return (Int(val)!)}))!
let oneToN = Array(repeating: 0, count: n! + 1).enumerated().map{$0.offset}.filter{$0 > 0}
let nestedLoopList = Array(repeating: oneToN, count: n!).enumerated()
let ans = nestedLoopList.map ({ (elem) -> [[Any]] in
let offset = elem.offset + 1
let elems = elem.element
let product = elems.map { x in
[offset,x]
}
return product
})
let ans2 = ans.flatMap{$0}.map{ elem in
let x = elem[0] as! Int
let y = elem[1] as! Int
if x >= y {
let a = maxCache[x]
let b = maxCache[x - y]! + int_list[y]
maxCache[x] = a! > b ? a : b
//print("a,b : \(a),\(b)")
}
}
print(maxCache[n!]!)
[[[1, 1], [1, 2], [1, 3], [1, 4]], [[2, 1], [2, 2], [2, 3], [2, 4]], [[3, 1], [3, 2], [3, 3], [3, 4]], [[4, 1], [4, 2], [4, 3], [4, 4]]]
이중 반복문을 이걸로 풀어서 함수형으로 해결하고자 했다.