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 찍어서 실행결과 기다리느라 애먹었다;;