Skip to content

Commit a95edd4

Browse files
author
Gonzalo Diaz
committed
[Hacker Rank] Interview Preparation Kit: Greedy Algorithms: Luck Balance. Solved ✓.
1 parent 3970aa1 commit a95edd4

File tree

4 files changed

+207
-0
lines changed

4 files changed

+207
-0
lines changed
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
# [Greedy Algorithms: Luck Balance](https://www.hackerrank.com/challenges/luck-balance)
2+
3+
- Difficulty: `#easy`
4+
- Category: `#ProblemSolvingBasic` `#greedyalgorithms`
5+
6+
Lena is preparing for an important coding competition that is preceded
7+
by a number of sequential preliminary contests.
8+
Initially, her luck balance is 0.
9+
She believes in "saving luck", and wants to check her theory.
10+
Each contest is described by two integers, `L[i]` and `T[i]`:
11+
12+
- `L[i]` is the amount of luck associated with a contest.
13+
If Lena wins the contest, her luck balance will decrease by `L[i]`;
14+
if she loses it, her luck balance will increase by `L[i]`.
15+
16+
- `T[i]` denotes the contest's importance rating.
17+
It's equal to `1` if the contest is important, and it's equal to `0` if it's unimportant.
18+
19+
If Lena loses no more than `k` important contests, what is the maximum amount
20+
of luck she can have after competing in all the preliminary contests?
21+
This value may be negative.
22+
23+
## Example
24+
25+
```text
26+
Contest L[i] T[i]
27+
1 5 1
28+
2 1 1
29+
3 4 0
30+
```
31+
32+
If Lena loses all of the contests, her will be `5 + 1 +4 = 10`.
33+
Since she is allowed to lose important contests,
34+
and there are only `2` important contests,
35+
she can lose all three contests to maximize her luck at `10`.
36+
37+
If `k = 1`, she has to win at least of the important contests.
38+
She would choose to win the lowest value important contest worth `1`.
39+
Her final luck will be `5 + 4 - 1 = 8`.
40+
41+
## Function Description
42+
43+
Complete the luckBalance function in the editor below.
44+
45+
luckBalance has the following parameter(s):
46+
47+
- `int k`: the number of important contests Lena can lose
48+
- `int contests[n][2]`: a 2D array of integers where each `contests[i]`
49+
contains two integers that represent the luck balance and importance of the contest
50+
51+
## Returns
52+
53+
- `int`: the maximum luck balance achievable
54+
55+
## Input Format
56+
57+
The first line contains two space-separated integers `n` and `k`,
58+
the number of preliminary contests and the maximum number
59+
of important contests Lena can lose.
60+
61+
Each of the next lines contains two space-separated integers,
62+
`L[i]` and `T[i]`, the contest's luck balance and its importance rating.
63+
64+
## Constraints
65+
66+
- $ 1 \leq n \leq 100 $
67+
- $ 0 \leq k \leq N $
68+
- $ 1 \leq L[i] \leq 10^4 $
69+
- $ T[i] \isin \{0,1\} $
70+
71+
## Sample Input
72+
73+
```text
74+
STDIN Function
75+
----- --------
76+
6 3 n = 6, k = 3
77+
5 1 contests = [[5, 1], [2, 1], [1, 1], [8, 1], [10, 0], [5, 0]]
78+
2 1
79+
1 1
80+
8 1
81+
10 0
82+
5 0
83+
```
84+
85+
## Sample Output
86+
87+
```text
88+
29
89+
```
90+
91+
## Explanation
92+
93+
There are `n = 6` contests. Of these contests, `4` are important
94+
and she cannot lose more than of them.
95+
Lena maximizes her luck if she wins the $ 3^{rd} $ important contest
96+
(where `L[i] = 1`) and loses all of the other five contests for a total
97+
luck balance of `5 + 2 + 8 + 10 + 5 - 1 = 29`.
Lines changed: 59 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,59 @@
1+
// @link Problem definition [[docs/hackerrank/interview_preparation_kit/greedy_algorithms/luck-balance.md]] // noqa
2+
3+
package hackerrank
4+
5+
import (
6+
"cmp"
7+
"slices"
8+
)
9+
10+
type Contest struct {
11+
luck int32
12+
important int32
13+
}
14+
15+
func luckBalance(k int32, contests [][]int32) int32 {
16+
var important_contests = []Contest{}
17+
var nonimportant_contests = []Contest{}
18+
19+
for _, contest := range contests {
20+
var contest = Contest{
21+
luck: contest[0],
22+
important: contest[1],
23+
}
24+
25+
if contest.important == 1 {
26+
27+
important_contests = append(important_contests, contest)
28+
} else {
29+
nonimportant_contests = append(nonimportant_contests, contest)
30+
}
31+
}
32+
33+
slices.SortFunc(
34+
important_contests,
35+
func(a, b Contest) int {
36+
return cmp.Or(
37+
-cmp.Compare(a.important, b.important),
38+
-cmp.Compare(a.luck, b.luck),
39+
)
40+
})
41+
42+
var total int32 = 0
43+
var size = int32(len(important_contests))
44+
var cut = min(k, int32(size))
45+
46+
for i := 0; int32(i) < cut; i++ {
47+
total += important_contests[i].luck
48+
}
49+
50+
for i := cut; i < size; i++ {
51+
total -= important_contests[i].luck
52+
}
53+
54+
for _, contest := range nonimportant_contests {
55+
total += contest.luck
56+
}
57+
58+
return total
59+
}
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
[
2+
{
3+
"title": "Sample Test case 0",
4+
"k": 3,
5+
"contests": [[5, 1], [2, 1], [1, 1], [8, 1], [10, 0], [5, 0]],
6+
"expected": 29
7+
}
8+
]
Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,43 @@
1+
package hackerrank
2+
3+
import (
4+
"fmt"
5+
"os"
6+
"testing"
7+
8+
"github.com/stretchr/testify/assert"
9+
"gon.cl/algorithms/utils"
10+
)
11+
12+
type LuckBalanceTestCase struct {
13+
Contests [][]int32 `json:"contests"`
14+
K int32 `json:"k"`
15+
Expected int32 `json:"expected"`
16+
}
17+
18+
var LuckBalanceTestCases []LuckBalanceTestCase
19+
20+
// You can use testing.T, if you want to test the code without benchmarking
21+
func LuckBalanceSetupSuite(t testing.TB) {
22+
wd, _ := os.Getwd()
23+
filepath := wd + "/luck_balance.testcases.json"
24+
t.Log("Setup test cases from JSON: ", filepath)
25+
26+
var _, err = utils.LoadJSON(filepath, &LuckBalanceTestCases)
27+
if err != nil {
28+
t.Log(err)
29+
}
30+
}
31+
32+
func TestLuckBalance(t *testing.T) {
33+
34+
LuckBalanceSetupSuite(t)
35+
36+
for _, tt := range LuckBalanceTestCases {
37+
testname := fmt.Sprintf("luckBalance(%v, %v) => %v \n", tt.K, tt.Contests, tt.Expected)
38+
t.Run(testname, func(t *testing.T) {
39+
ans := luckBalance(tt.K, tt.Contests)
40+
assert.Equal(t, tt.Expected, ans)
41+
})
42+
}
43+
}

0 commit comments

Comments
 (0)