Swift랑 친해지기/programmers 풀기

[프로그래머스] 피로도 (Swift)

데브킹덕 2023. 7. 10. 14:33

https://school.programmers.co.kr/learn/courses/30/lessons/87946

 

프로그래머스

코드 중심의 개발자 채용. 스택 기반의 포지션 매칭. 프로그래머스의 개발자 맞춤형 프로필을 등록하고, 나와 기술 궁합이 잘 맞는 기업들을 매칭 받으세요.

programmers.co.kr

 

import Foundation

func solution(_ k:Int, _ dungeons:[[Int]]) -> Int {
    
    var result = 0 //최대 던전수
    
    
    //모든 경우의 수를 생각해봐야 하기 때문에 재귀 함수 사용
    func visit(_ orders: [Int]){
        //3. orders에 가야할 던전의 순서가 정해질 경우
        if orders.count == dungeons.count{
            
            var remainingFatigue = k //남은 피로도
            var count = 0 // 진행한 던전개수
            
            /*
            4.남은 피로도가 던전의 최소피로도 이상일 경우
            진행 던전개수를 늘리고 남은피로도를 줄이도록함
            */
            for i in 0..<orders.count{
                if remainingFatigue >= dungeons[orders[i]][0]{
                    count += 1
                    remainingFatigue -= dungeons[orders[i]][1]
                }
            }
            
            //5.진행 가능한 던전이 최대일 경우 result 갱신
            if count > result{
                result = count
            }
        }
        // 2.orders에 모든 경우의 수를 인덱스값으로 저장
        for i in 0..<dungeons.count{
            if !orders.contains(i){
                visit(orders + [i])
            }
        }
    }
    
    // 1.처음 입장할 던전을 가지고 재귀함수 실행
    for i in 0..<dungeons.count{
        visit([i])
    }
    
    return result
}

 

* 재귀 함수 확인 코드* 

import Foundation

func solution(_ k:Int, _ dungeons:[[Int]]) -> Int {
    
    var result = 0
    
    func visit(_ orders: [Int]){
        print("처음orders",orders)
        
        if orders.count == dungeons.count{
            
            var remainingFatigue = k //남은 피로도
            
            var count = 0 // 진행한 던전개수
            
            for i in 0..<orders.count{
                if remainingFatigue >= dungeons[orders[i]][0]{
                    count += 1
                    print("사용전 피로도:\(remainingFatigue)")
                    remainingFatigue -= dungeons[orders[i]][1]
                    print("사용후 피로도:\(remainingFatigue)")
                }
            }
                
                if count > result{
                    result = count
                }
            
        }
        
        
        for i in 0..<dungeons.count{
            if !orders.contains(i){
                print("i:\(i)")
                print("orders: \(orders)")
                visit(orders + [i])
            }
        }
        print("끝")
        print("전에 호출해서 부른 visit: \(orders)")
    }
    
    for i in 0..<dungeons.count{
        print(i)
        visit([i])
    }
    
    return result
}
solution(80, [[80,20],[50,40],[30,10]])
/*
Debug area에 출력된 결과

0
처음orders [0]
i:1
orders: [0]
처음orders [0, 1]
i:2
orders: [0, 1]
처음orders [0, 1, 2]
사용전 피로도:80
사용후 피로도:60
사용전 피로도:60
사용후 피로도:20
끝
전에 호출해서 부른 visit: [0, 1, 2]
끝
전에 호출해서 부른 visit: [0, 1]
i:2
orders: [0]
처음orders [0, 2]
i:1
orders: [0, 2]
처음orders [0, 2, 1]
사용전 피로도:80
사용후 피로도:60
사용전 피로도:60
사용후 피로도:50
사용전 피로도:50
사용후 피로도:10
끝
전에 호출해서 부른 visit: [0, 2, 1]
끝
전에 호출해서 부른 visit: [0, 2]
끝
전에 호출해서 부른 visit: [0]
1
처음orders [1]
i:0
orders: [1]
처음orders [1, 0]
i:2
orders: [1, 0]
처음orders [1, 0, 2]
사용전 피로도:80
사용후 피로도:40
사용전 피로도:40
사용후 피로도:30
끝
전에 호출해서 부른 visit: [1, 0, 2]
끝
전에 호출해서 부른 visit: [1, 0]
i:2
orders: [1]
처음orders [1, 2]
i:0
orders: [1, 2]
처음orders [1, 2, 0]
사용전 피로도:80
사용후 피로도:40
사용전 피로도:40
사용후 피로도:30
끝
전에 호출해서 부른 visit: [1, 2, 0]
끝
전에 호출해서 부른 visit: [1, 2]
끝
전에 호출해서 부른 visit: [1]
2
처음orders [2]
i:0
orders: [2]
처음orders [2, 0]
i:1
orders: [2, 0]
처음orders [2, 0, 1]
사용전 피로도:80
사용후 피로도:70
사용전 피로도:70
사용후 피로도:30
끝
전에 호출해서 부른 visit: [2, 0, 1]
끝
전에 호출해서 부른 visit: [2, 0]
i:1
orders: [2]
처음orders [2, 1]
i:0
orders: [2, 1]
처음orders [2, 1, 0]
사용전 피로도:80
사용후 피로도:70
사용전 피로도:70
사용후 피로도:30
끝
전에 호출해서 부른 visit: [2, 1, 0]
끝
전에 호출해서 부른 visit: [2, 1]
끝
전에 호출해서 부른 visit: [2]

*/