프로그래머스 - 메뉴 리뉴얼(Lv. 2)

OQ·2022년 3월 7일
0

프로그래머스

목록 보기
13/33

문제 링크

풀이

import Foundation

func solution(_ orders:[String], _ course:[Int]) -> [String] {
    var menuCntDic: [String: Int] = [:] // (메뉴명, 시킨 개수)
    
    // 정렬된 문자열
    let sortedOrders = orders.map { order -> [String] in
        var arg = order.map { String($0) } 
        arg.sort()
        return arg
    }
    
    // 조합할 수 있는 모든 메뉴와 해당 메뉴를 시킨 개수를 menuCntDic에 넣는다.
    sortedOrders.forEach {
        makeAvailMenu($0, 0, "", &menuCntDic)
    }
    
    // 결과 뽑기
    var result: [String] = []
    for amount in course {
        var menuKey: [String] = []
        var max = 2
        for key in menuCntDic.keys {
            if key.count == amount {
                if menuCntDic[key] == max {
                    menuKey.append(key)
                } else if menuCntDic[key]! > max {
                    menuKey = [key]
                    max = menuCntDic[key]!
                }
            }
        }
        
        result.append(contentsOf: menuKey)
    }
    result.sort()
    
    // print(menuCntDic)
    
    return result
}

// 가능한 모든 코스요리 메뉴 만들기 및 개수 세기
func makeAvailMenu(_ order: [String], _ depth: Int, _ str: String, _ menuCntDic: inout [String: Int]) {
	// 세트메뉴는 2개 이상부터
    if depth > 1  {
        if menuCntDic.keys.contains(str) {
            menuCntDic[str]! += 1
        } else {
            menuCntDic[str] = 1
        }
    }
    
    for index in depth..<order.count {
        let char = order[index]
        if !str.contains(char) {
            let string = "\(str)\(char)"
            makeAvailMenu(order, index + 1, string, &menuCntDic)
        }
    }
}

후기

스트링 파싱과 배열 정렬, 탐욕법 등 코딩 테스트에 필요한 기본 역량을 고루고루 사용해야했던 문제.
디버딩을 사용 못해서 함참 해맸다.
중간중간 값을 보면서 풀었으면 더 쉽게 해결됐을텐데 매번 print 찍어서 실행결과 기다리느라 애먹었다;;

profile
덕업일치 iOS 개발자

0개의 댓글