나의 기록, 현진록

[Swift] 프로그래머스 2021 KAKAO BLIND RECRUITMENT > 메뉴 리뉴얼 본문

Programming/Algorithm & Data Structure

[Swift] 프로그래머스 2021 KAKAO BLIND RECRUITMENT > 메뉴 리뉴얼

guswlsdk 2022. 8. 9. 14:21
반응형

 

 

프로그래머스

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

programmers.co.kr

 

 

 

<문제풀이>

orders의 주문마다 메뉴를 조합할 수 있는 모든 경우의 수를 구해야 한다.

조합한 메뉴의 수가 course에 포함된 수일 경우의 갯수를 세어 저장한다. (아래 코드는 딕셔너리를 사용하였음)

 

모든 경우의 조합을 만들기, 오름차순으로 정렬, 중복(AB와 BA)처리를 주의하자

 

<코드>

import Foundation
func solution(_ orders:[String], _ course:[Int]) -> [String] {
    var records = [[String]:Int]()
    var result = [String]()
   
    func combi(order: [String], temp: [String], limit: Int, index: Int){
        if temp.count == limit{
            if records[temp] != nil{
                records[temp]! += 1
            }else{
                records[temp] = 1
            }
            return
        }
        var temp = temp
        for i in index..<order.count{
            if !temp.contains(order[i]){
                temp.append(order[i])
                combi(order: order, temp: temp, limit: limit, index: i+1)
                temp.removeLast()
            }
        }
    }
    
    for limit in course{
        for order in orders {
            combi(order: order.sorted(by: <).map{String($0)},temp: [String]() ,limit: limit, index: 0)
        }
    }
    records = records.filter{$0.1 > 1}
    for c in course {
        let temp = records.filter{$0.0.count == c}
        let max = temp.values.max()
        for i in temp.filter({$0.1 == max}).keys{
            result.append(i.joined())
        }
    }
    return result.sorted(by: <)
}

 

반응형