ios개발/함수형 프로그래밍

<함수형 프로그래밍> 백준 9461번

studying develop 2020. 6. 7. 18:08

이건 음 재귀함수를 이용해 해결했다. 그런데 메모이제이션 부분은 mutable하게 구현되서 마음에 들지 않는다. 꽤나 찾아봤는데 메모이제이션을 immutable하게 할수 있는 방법을 모르겠다.

 

이 문제를 통해서 재귀함수를 이용해 immutable하게 구현할수 있다는 것을 한걸음 느끼게 된거같다.

 

파일에서 자동으로 입력 받는 부분이나, 입력부를 처리하는게 제일 까다로웠다.

 

import Foundation
/*
let file = "input.txt"
var text = ""

if let dir = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first{
    let fileURL = dir.appendingPathComponent(file)

    do{
        text = try String(contentsOf: fileURL, encoding: .utf8)
    }
    catch let error as NSError{
        print("error : \(error.localizedDescription)")
    }
    
}
*/
var sumCache = [Int:Int]()
let n = Int(readLine()!)
var text : [String] = []
for _ in 0 ..< n! {
    let x = readLine()
    text.append(x!)
}

//print(text)

//let str_list = text.split(separator: "\n").map(String.init)
let int_list = text.map({ (val : String) -> Int in return Int(val)! } )

//let nlist = int_list.enumerated().filter( {$0.offset != 0} ).map( { $0.element } )


//print(nlist)

let ans = int_list.map(wave)


func wave(_ nth : Int) -> Int {
    if nth == 1 {
        return 1
    } else if nth == 2{
        return 1
    } else if nth == 3{
        return 1
    }
    else {
        if let cachedVal = sumCache[nth]{
            return cachedVal
        }
        let ans = wave(nth-2) + wave(nth-3)
        sumCache[nth] = ans
        return ans
    }
}

//print(ans)
ans.map({print($0)})