Algorithm/Programmers

Programmers Lv2) [2021 카카오블라인드] 메뉴 리뉴얼

삼쓰 웅쓰 2021. 2. 27. 14:04
728x90

출처: programmers.co.kr/learn/courses/30/lessons/72411

분류: 조합


접근방식

카카오 블라인드 2번 문제였습니다!

주어진 코스의 개수에 해당하는 조합을 모두 찾고 그 중에서 가장 많은 사람이 먹었던 메뉴들을 골라주면 됩니다.
여러 개라면 모두 넣어줍니다.

주어진 입력 범위가 그리 크지 않기 때문에 ( 20(orders) x 10(각 order의 최대 길이 ) x 10(course) x 10(각 course의 최대 길이) = 20000 정도?) 
그냥 다 돌면서 조합을 찾아주고 필터해주면 됩니다.

조합을 찾는 방식은 어렵지않게 찾아볼 수 있습니다 :)

저는 각 코스 문자열의 인덱스를 돌면서
해당 인덱스를 추가해서 재귀,
추가하지 않고 재귀를 돌려서 만들었습니다.

func makeOrder(_ order: [Character], _ courseCount: Int, _ idx: Int, _ making: String, _ newOrders: inout [String]) {
    guard making.count < courseCount else {
        newOrders.append(String(making.sorted()))
        return
    }
    guard idx < order.count else { return }
    
    makeOrder(Array(order), courseCount, idx+1, making, &newOrders)
    makeOrder(Array(order), courseCount, idx+1, making + String(order[idx]), &newOrders)
}

한 가지 주의할 점은 최종 결과들 sort 뿐만 아니라 각 조합을 만들어 추가해줄 때도 sort해서 넣어줘야 합니다.
친절하게 3번 예시에서 걸러주고 있네요.

 

해결방법

import Foundation

func solution(_ orders:[String], _ course:[Int]) -> [String] {
    var resultOrders = [String]()
    
    for courseCount in course {
        var maxCourseCount = 0
        var newOrderTable = [String: Int]()
        
        for order in orders {
            var newOrders = [String]()
            makeOrder(Array(order), courseCount, 0, "", &newOrders)
            for newOrder in newOrders {
                newOrderTable[newOrder, default: 0] += 1
                maxCourseCount = max(maxCourseCount, newOrderTable[newOrder]!)
            }
        }
        
        print(maxCourseCount, newOrderTable)
        if maxCourseCount > 1 {
            resultOrders.append(contentsOf: newOrderTable.filter { $0.value == maxCourseCount }.map { $0.key })
        }
    }
    
    return resultOrders.sorted()
}

func makeOrder(_ order: [Character], _ courseCount: Int, _ idx: Int, _ making: String, _ newOrders: inout [String]) {
    guard making.count < courseCount else {
        newOrders.append(String(making.sorted()))
        return
    }
    guard idx < order.count else { return }
    
    makeOrder(Array(order), courseCount, idx+1, making, &newOrders)
    makeOrder(Array(order), courseCount, idx+1, making + String(order[idx]), &newOrders)
}

 

배운점

다 풀고나면 그렇게 어렵지 않은 문제였는데

왜 이리 오래걸리는 것이냐..............