[회고] 신입 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하게 구현해놓고 필요할때마다 사용하는 것도 좋은 전략이 될 것 같습니다.
반응형