알고리즘 문제 풀이

[Swift] 프로그래머스 LV2. 피로도

lgvv 2022. 4. 1. 23:48

프로그래머스 LV2. 피로도

 

✅ 프로그래머스 LV2. 피로도

 

나 이제 재귀를 조금 잘쓰는 것 같다. 

물론 완전 탐색에서의 재귀이지만, dfs, bfs 등도 잘 풀 수 있어야 하니 꾸준히 노력하자

갑자기 적는거지만 알고리즘 왜 푸냐면 개인적으로 앱 개발에 있어서 어떠한 알고리즘이라 로직 처리를 할 때 매우 약하다. 그런 점을 보완하고자 알고리즘을 공부한다.

 

import Foundation

struct p87946 {
    
    static func run() {
        print(p87946.solution(80, [[80,20],[50,40],[30,10]])) // 3
    }
    
    static var count = 0
    static var results: Set<[[Int]]> = []
    
    static func solution(_ k:Int, _ dungeons:[[Int]]) -> Int {
        // 정렬이 먼저겠다. 정렬 1순위 : 사용 피로도, 정렬 2순위 : 최소 피로도
        // 던점 최대 8개면 그냥 배열 갖고 완전탐색 해도 괜찮을 듯
        
        reculsive(list: [], remain: dungeons, len: dungeons.count)
        
//        print("result -> \(results)")
        for result in results {
            var k = k
            var tempCount = 0
            
            for item in result {
//                print("\(item[0]) || \(k)")
                if item[0] <= k {
                    k -= item[1]
                    tempCount += 1
//                    print("ad \(tempCount)")
                }
            }
            count = max(count, tempCount)
            
            if count == dungeons.count { break }
        }
        
        return count
    }
    
    static func reculsive(list: [[Int]], remain: [[Int]], len: Int) {
        if list.count == len {
//            print("🎃 \(list)")
            results.insert(list)
            return
        }
        
        for i in 0..<remain.count {
            var list = list
            list.append(remain[i])
            var arr = remain
            arr.remove(at: i)
            reculsive(list: list, remain: arr, len: len)
        }
        
    }
}