DEV Community

Luciano Pinheiro
Luciano Pinheiro

Posted on

HackerRank Hash Tables: Ice Cream Parlor solution in python

This is solution for HackerRank Hash Tables: Ice Cream Parlor challenge, in python. This is a problem in the Interview Preparation Kit > Search Algorithms and is considered of medium difficulty.

The problem

The problem is simple: 2 friends want to buy ice cream and they must spend all their money each trip. some rules:

  • Every flavor has a different value.
  • They must choose the flavors (numbered) to sum up to money they have
  • they can't buy the same flavor
  • You need to return the index starting by 1 (not 0)

The naive solution

The naive solution is to traverse the entire set almost twice. Almost because for friend 2 we will traverse only the positions not chose yet

# inefficient, naive solution: O(n²)
def whatFlavors_inneficient(cost, money):
    for i1, c1 in enumerate(cost, 1):
        for i2, c2 in enumerate(cost[i1:], i1 + 1):
            if (c1 + c2) == money:
                print(i1, i2)
                return
Enter fullscreen mode Exit fullscreen mode

The final solution

In the final solution, we must trade time for space, creating a dictionary. The reason is to find, after we spend the money on the first ice cream, if there is another flavor to sum up to the money we got there.

    # cost: [1, 4, 5, 3, 2]
    dcost = dict(enumerate([c for c in cost], 1))
    # {1: 1, 2: 4, 3: 5, 4: 3, 5: 2}
    dcost = {v: k for k, v in dcost.items()}
    # {1: 1, 4: 2, 5: 3, 3: 4, 2: 5}
Enter fullscreen mode Exit fullscreen mode

So, we still need to traverse all the flavors, but just once.

The complete solution is as follows

def whatFlavors(cost, money):
    # inverted (v,k) dictionary of costs
    # to find easily the value that complements the first iteration
    dcost = dict(enumerate([c for c in cost], 1))
    dcost = {v: k for k, v in dcost.items()}

    # traverse once
    for i1, c1 in enumerate(cost, 1): 
        # the cost of second ice cream must be
        c2 = money - c1
        i2 = dcost.get(c2)
        # if found, return
        if i2 and (i2 != i1):
            print(i1, i2)
            return
Enter fullscreen mode Exit fullscreen mode

Top comments (0)