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]]]

이중 반복문을 이걸로 풀어서 함수형으로 해결하고자 했다.