파이썬 코딩테스트 강좌, 칵테일 만들기

문제 설명

당신은 한 수페르마켓의 바에서 일하는 바텐더입니다. 바텐더로서 다양한 칵테일을 만들고 싶습니다. 당신은 각각의 칵테일을 만들기 위해 필요한 재료들의 목록을 보유하고 있으며, 특정 재료가 얼마나 필요한지 알고 있습니다.

당신은 사용자에게 원하는 칵테일의 이름과 가용한 재료 목록을 제공받습니다. 사용자는 재료의 세트에서 원하는 칵테일을 만들 수 있는지 알고 싶어합니다. 제시된 재료로 원하는 칵테일을 만들 수 있다면 ‘가능’이라고 출력하고, 그렇지 않다면 ‘불가능’이라고 출력하세요.

입력 형식

  • 첫 번째 줄은 칵테일 이름입니다. (예: “마가리타”)
  • 두 번째 줄은 사용 가능한 재료들로 이루어진 문자열입니다. (예: “테킬라,라임주스,트리플섹”)
  • 세 번째 줄은 각 재료와 칵테일에 필요한 재료의 수량으로 이루어진 문자열입니다. (예: “테킬라:50,라임주스:30,트리플섹:10”)

출력 형식

칼렉틀을 만들 수 있다면 “가능”이라고, 그렇지 않다면 “불가능”이라고 출력하세요.

제약 조건

  • 재료명의 길이는 1에서 50자 이내입니다.
  • 수량은 모두 양의 정수입니다.
  • 재료는 쉼표로 구분됩니다.

문제 풀이

이 문제를 푸는 방법에 대해 단계적으로 알아보겠습니다.

1단계: 입력 파싱

먼저, 사용자로부터 전달받은 입력 데이터를 파싱하여 각각의 요소를 추출합니다. 칵테일 이름, 사용 가능한 재료 목록, 칵테일의 재료 목록을 파악해야 합니다.

2단계: 데이터 구조

재료명과 이를 만들기 위해 필요한 수량을 저장하기 위해 딕셔너리 자료구조를 사용할 것입니다. 각 재료를 키로 하고, 필요한 수량을 값으로 하는 형태로 저장되며, 사용 가능한 재료는 셋(Set)으로 저장합니다.

3단계: 비교 및 확인

이제 재료 목록이 준비되었으므로, 사용자가 원하는 칵테일을 만들기 위해 필요한 모든 재료가 사용 가능한 재료에 포함되어 있는지를 확인해야 합니다.

4단계: 결과 출력

모든 조건을 만족하는 경우 “가능”을 출력하고, 그렇지 않으면 “불가능”이라고 출력합니다.

예제 코드

        
def cocktail_availability(cocktail_name, available_ingredients, required_ingredients):
    # 재료를 저장하는 딕셔너리 생성
    required_dict = {}
    for item in required_ingredients.split(','):
        ingredient, quantity = item.split(':')
        required_dict[ingredient] = int(quantity)
    
    # 사용 가능한 재료를 저장하는 세트 생성
    available_set = set(available_ingredients.split(','))
    
    # 필요한 재료가 모두 사용 가능한지 확인
    for ingredient, quantity in required_dict.items():
        if ingredient not in available_set:
            return '불가능'
    
    return '가능'

# 예시 입력
cocktail_name = "마가리타"
available_ingredients = "테킬라,라임주스,트리플섹"
required_ingredients = "테킬라:50,라임주스:30,트리플섹:10"

# 함수 호출
result = cocktail_availability(cocktail_name, available_ingredients, required_ingredients)
print(result)  # 출력: 가능
        
    

결과

입력 데이터에 기반하여 칵테일을 만들 수 있는지 확인했습니다. 예를 들어, 위에 제시된 입력으로 함수를 실행하면 “가능”이라는 결과를 반환합니다. 즉, 사용자는 원하는 칵테일을 만들 수 있습니다.

해결책의 복잡도 분석

시간 복잡도는 O(n)입니다. 여기서 n은 재료의 수입니다. 각각의 재료에 대해 딕셔너리와 셋을 업데이트하고 비교하므로 선형 시간 복잡도를 가집니다.

공간 복잡도 또한 O(n)입니다. 필요한 재료를 저장하기 위한 딕셔너리와 사용 가능한 재료를 위한 세트가 필요하기 때문입니다.