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

Image of Docusign

🛠️ Bring your solution into Docusign. Reach over 1.6M customers.

Docusign is now extensible. Overcome challenges with disconnected products and inaccessible data by bringing your solutions into Docusign and publishing to 1.6M customers in the App Center.

Learn more

Top comments (0)

A Workflow Copilot. Tailored to You.

Pieces.app image

Our desktop app, with its intelligent copilot, streamlines coding by generating snippets, extracting code from screenshots, and accelerating problem-solving.

Read the docs