[회고] 신입 iOS 개발자가 되기까지 feat. 카카오 자세히보기

💻 CS/알고리즘 연습

[알고리즘 연습] 메뉴 리뉴얼 (프로그래머스 lv2, 스위프트)

inu 2022. 2. 24. 22:47

문제

https://programmers.co.kr/learn/courses/30/lessons/72411

 

코딩테스트 연습 - 메뉴 리뉴얼

레스토랑을 운영하던 스카피는 코로나19로 인한 불경기를 극복하고자 메뉴를 새로 구성하려고 고민하고 있습니다. 기존에는 단품으로만 제공하던 메뉴를 조합해서 코스요리 형태로 재구성해서

programmers.co.kr

풀이

import Foundation func solution(_ orders:[String], _ course:[Int]) -> [String] { ​​​​var result = [String]() ​​​​for n in course { ​​​​​​​​var temp = [String:Int]() ​​​​​​​​var check = true ​​​​​​​​orders.forEach { order in ​​​​​​​​​​​​combination(order, n).forEach { ​​​​​​​​​​​​​​​​temp[$0, default: 0] += 1 ​​​​​​​​​​​​​​​​if temp[$0]! >= 2 { ​​​​​​​​​​​​​​​​​​​​check = false ​​​​​​​​​​​​​​​​} ​​​​​​​​​​​​} ​​​​​​​​} ​​​​​​​​if check { continue } ​​​​​​​​let sortedTemp = temp.sorted(by: { $0.value > $1.value }) ​​​​​​​​let limit = sortedTemp[0].value ​​​​​​​​for (key, value) in sortedTemp { ​​​​​​​​​​​​if value == limit{ ​​​​​​​​​​​​​​​​result.append(key) ​​​​​​​​​​​​} else { ​​​​​​​​​​​​​​​​break ​​​​​​​​​​​​} ​​​​​​​​} ​​​​} ​​​​return result.sorted() } func combination(_ str: String, _ n: Int) -> [String] { ​​​​var result = [String]() ​​​​if str.count < n { ​​​​​​​​return result ​​​​} ​​​​var sa = Array(str).map { String($0) } ​​​​var stack = [(String, Int)]() ​​​​for i in 0..<str.count { ​​​​​​​​stack.append((sa[i],i)) ​​​​} ​​​​while stack.count > 0 { ​​​​​​​​let now = stack.removeLast() ​​​​​​​​let nowString = now.0 ​​​​​​​​let nowIdx = now.1 ​​​​​​​​if nowString.count == n { ​​​​​​​​​​​​result.append(String(nowString.sorted())) ​​​​​​​​​​​​continue ​​​​​​​​} ​​​​​​​​guard nowIdx+1 <= sa.count-1 else { continue } ​​​​​​​​for i in nowIdx+1...sa.count-1 { ​​​​​​​​​​​​stack.append((nowString + sa[i], i)) ​​​​​​​​} ​​​​} ​​​​return result }
  • 어렵지 않은 문제였지만, Swift에서 조합을 사용하는 것이 익숙치않아 포스팅해놓습니다.
  • 가능한 조합의 케이스를 모두 확인하여 return하는 함수를 짜놓고 이를 활용하는 방식으로 해결했습니다.
  • combination을 Generic하게 구현해놓고 필요할때마다 사용하는 것도 좋은 전략이 될 것 같습니다.