[PS] BOJ 26596 / 황금 칵테일

[PS] BOJ 26596 / 황금 칵테일
문제 링크: https://www.acmicpc.net/problem/26596
Thumbnail: Photo by Nuff . (Unsplash)

황금 칵테일 한잔, 온더락으로.

풀이

\(M\)회에 걸쳐 재료들을 투입하게 되는데, 이중에는 같은 재료가 여러 번 들어갈 수도 있습니다. 따라서, 각 재료마다 투입된 총량을 계산할 필요가 있는데, 저는 Map 자료구조의 일종인 딕셔너리(dict)를 사용해 구현했습니다.

재료별 총량을 계산한 뒤로, 들어간 재료의 종류가 \(N\)개라 하면 단순히 배열을 이중으로 모든 재료의 곱을 구하는 방식(\(O(N^2)\)) 으로 풀어도 시간제한 안에 풀 수 있습니다. 애당초 \(1 \le M \le 5000\) 이고 \(N \le M\) 이기 때문입니다.

하지만, 반복을 조금이라도 더 줄이자면 각 재료의 총량을 양을 기준으로 정렬해버린 뒤, 자기보다 큰 수와의 곱만 비교하게끔 반복을 줄일 수 있습니다.

전체 코드

input = open(0).readline
M = int(input())

ingredients = {}
for _ in range(M):
    ingredient, amount = input().rstrip().split()
    try:
        ingredients[ingredient] += int(amount)
    except KeyError:
        ingredients[ingredient] = int(amount)

amounts = sorted(ingredients.values())
result = False
for i in range(len(amounts) - 1):
    for j in range(i + 1, len(amounts)):
        if amounts[i] * 1618 // 1000 == amounts[j]:
            result = True
            break

print("Delicious!" if result else "Not Delicious...")

solution.py