To solve this optimization problem, we first need to define the variables and constraints based on the given information.

Let's denote:
- \(x\) as the number of hockey sticks sold,
- \(y\) as the number of pucks sold.

The objective is to maximize profit. The profit from selling one hockey stick is $50, and from selling one puck is $5. Therefore, the total profit can be represented as \(50x + 5y\).

Constraints:
1. **Budget Constraint**: The store can spend at most $20,000 on hockey sticks and pucks. Given that a hockey stick costs $75 and a puck costs $2, this constraint can be written as \(75x + 2y \leq 20000\).
2. **Hockey Sticks Sales Limit**: At least 50 but at most 110 hockey sticks are sold each month, which translates to \(50 \leq x \leq 110\).
3. **Pucks Sales Limit**: The number of pucks sold is at most three times the number of hockey sticks sold, so \(y \leq 3x\).

Now, let's formulate this problem in Gurobi code:

```python
from gurobipy import *

# Create a new model
m = Model("Hockey_Store_Optimization")

# Define variables
x = m.addVar(lb=50, ub=110, vtype=GRB.INTEGER, name="hockey_sticks")
y = m.addVar(vtype=GRB.INTEGER, name="pucks")

# Set the objective function: Maximize profit
m.setObjective(50*x + 5*y, GRB.MAXIMIZE)

# Add constraints
m.addConstr(75*x + 2*y <= 20000, "budget_constraint")
m.addConstr(y <= 3*x, "puck_sales_limit")

# Optimize the model
m.optimize()

# Print the results
if m.status == GRB.OPTIMAL:
    print("Optimal solution found:")
    print(f"Hockey Sticks to sell: {x.x}")
    print(f"Pucks to sell: {y.x}")
    print(f"Maximum Profit: {m.objVal}")
else:
    print("No optimal solution found")
```