코딩테스트

[Swift 알고리즘] 프로그래머스(Lv.2) - 피로도

유정주 2022. 5. 3. 19:05
반응형

안녕하세요. 개발 중인 정주입니다.

 

오늘은 "프로그래머스(Lv.2) - 피로도" 문제를 풀었습니다.

 


Github

 

GitHub - jeongju9216/SwiftAlgorithm: 스위프트 알고리즘

스위프트 알고리즘. Contribute to jeongju9216/SwiftAlgorithm development by creating an account on GitHub.

github.com

 

문제 링크

 

코딩테스트 연습 - 피로도

XX게임에는 피로도 시스템(0 이상의 정수로 표현합니다)이 있으며, 일정 피로도를 사용해서 던전을 탐험할 수 있습니다. 이때, 각 던전마다 탐험을 시작하기 위해 필요한 "최소 필요 피로도"와 던

programmers.co.kr

 


풀이

이번 문제는 조합으로 풀 수 있는 문제입니다.

 

1. 던전을 방문 순서의 모든 조합을 구합니다.

던전을 방문 순서의 모든 조합을 구합니다.

 

2. 구한 조합을 이용해 방문 가능한 최대 던전 수를 구합니다.

조합을 하나하나 확인해 봅니다.

만약 k가 최소 필요 피로도보다 적다면 break 합니다.

하나의 조합을 모두 살펴보면 최대 던전 수를 갱신합니다.

 

감사합니다!


전체 코드

import Foundation

func combi(_ n: Int) -> [[Int]] {
    var result: [[Int]] = []
    
    func combination(_ arr: [Int]) {
        if arr.count == n {
            result.append(arr)
            return
        } else {
            for i in 0..<n {
                if !arr.contains(i) {
                    combination(arr + [i])    
                }
            }
        }
    }
    
    combination([])
    
    return result
}

func solution(_ k:Int, _ dungeons:[[Int]]) -> Int {
    
    let combination = combi(dungeons.count)
    // print("combination: \(combination)")
    
    var result = 0
    combination.forEach {
        var k = k, count = 0
        
        for index in $0 {
            guard k >= dungeons[index][0] else { break }
            
            k -= dungeons[index][1] 
            count += 1
        }
        
        result = max(result, count)
    }
    
    return result
}

아직은 초보 개발자입니다.

더 효율적인 코드 훈수 환영합니다!

공감 댓글 부탁드립니다.

 

 

반응형