- 출처: 2021 KAKAO BLIND RECRUITMENT
- 난이도: Level 2
- 풀이 언어: Swift
- 문제 요약: 단품메뉴들을 주어진 조건에 따라 코스요리 메뉴로 구성하기
func solution(_ orders:[String], _ course:[Int]) -> [String] {
var menuSet = [String: Int]()
var result = [String]()
func combination(origin: [Character], n: Int, resultString: String) {
if course.contains(resultString.count) {
menuSet[resultString] = (menuSet[resultString] ?? 0) + 1
}
for i in n + 1..<origin.count {
combination(origin: origin, n: i, resultString: "\(resultString)\(origin[i])")
}
}
for order in orders {
let menus: [Character] = order.map { $0 }.sorted()
for i in menus.indices {
combination(origin: menus, n: i, resultString: "\(menus[i])")
}
}
for n in course {
let max = menuSet.filter { $0.key.count == n && $0.value > 1 }.values.max()
result += menuSet.filter { $0.key.count == n && $0.value == max }.keys.map { $0 }
}
return result.sorted()
}
- 처음에는 백트래킹 알고리즘을 이용해 문제를 풀었다. 뭔가 정답이 제출되긴 했지만 풀면서도 '이게 맞아?'하는 생각이 드는 풀이였고 효율도 좋지 못했다.
- 스터디원분들을 통해 훨씬 간단히 문제를 풀 수 있음을 알 수 있었다. 순열과 조합 문제를 좀 더 많이 풀어봐야겠다는 생각이 들었다.