Skip to content

Commit 5b187c3

Browse files
authored
Merge pull request #384 from sir-gon/feature/luck-balance
[Hacker Rank] Interview Preparation Kit: Greedy Algorithms: Luck Bala…
2 parents cc2fe85 + 9a19785 commit 5b187c3

File tree

3 files changed

+243
-0
lines changed

3 files changed

+243
-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`
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: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { describe, expect, it } from '@jest/globals';
2+
import { logger as console } from '../../../logger';
3+
4+
import { luckBalance } from './luck-balance';
5+
6+
const TEST_CASES = [
7+
{
8+
title: 'Sample Test case 0',
9+
k: 3,
10+
contests: [
11+
[5, 1],
12+
[2, 1],
13+
[1, 1],
14+
[8, 1],
15+
[10, 0],
16+
[5, 0]
17+
],
18+
expected: 29
19+
},
20+
{
21+
title: 'Sample Test case 1',
22+
k: 5,
23+
contests: [
24+
[13, 1],
25+
[10, 1],
26+
[9, 1],
27+
[8, 1],
28+
[13, 1],
29+
[12, 1],
30+
[18, 1],
31+
[13, 1]
32+
],
33+
expected: 42
34+
},
35+
{
36+
title: 'Sample Test case 1',
37+
k: 2,
38+
contests: [
39+
[5, 1],
40+
[4, 0],
41+
[6, 1],
42+
[2, 1],
43+
[8, 0]
44+
],
45+
expected: 21
46+
}
47+
];
48+
49+
describe('luck-balance', () => {
50+
it('luckBalance test cases', () => {
51+
expect.assertions(3);
52+
53+
TEST_CASES.forEach((test) => {
54+
const answer = luckBalance(test.k, test.contests);
55+
56+
console.debug(
57+
`luckBalance(${test.k}, ${test.contests}) solution found: ${answer}`
58+
);
59+
60+
expect(answer).toStrictEqual(test.expected);
61+
});
62+
});
63+
});
Lines changed: 83 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
/**
2+
* @link Problem definition [[docs/hackerrank/interview_preparation_kit/greedy_algorithms/luck-balance.md]]
3+
*/
4+
5+
class Contest {
6+
luck: number;
7+
important: number;
8+
9+
constructor(luck: number, important: number) {
10+
this.luck = luck;
11+
this.important = important;
12+
}
13+
}
14+
15+
type SortOrder = 'asc' | 'desc';
16+
17+
interface SortBy<T> {
18+
property: keyof T;
19+
order?: SortOrder;
20+
}
21+
22+
function dynamicSort<T>(array: T[], sortBy: SortBy<T>[]): T[] {
23+
const initialValue = 0;
24+
return array.sort((a, b) =>
25+
sortBy.reduce((_, current) => {
26+
const { property, order = 'asc' } = current;
27+
28+
let comparison = 0;
29+
if (a[property] > b[property]) {
30+
comparison = 1;
31+
} else if (a[property] < b[property]) {
32+
comparison = -1;
33+
}
34+
35+
if (order === 'desc') {
36+
comparison *= -1;
37+
}
38+
39+
return comparison;
40+
}, initialValue)
41+
);
42+
}
43+
44+
export function luckBalance(k: number, contests: number[][]): number {
45+
let importantContests: Contest[] = [];
46+
const nonimportantContests: Contest[] = [];
47+
48+
contests.forEach((contest) => {
49+
const [luck, important] = [...contest];
50+
const theContest = new Contest(luck, important);
51+
52+
if (important === 1) {
53+
importantContests.push(theContest);
54+
} else {
55+
nonimportantContests.push(theContest);
56+
}
57+
});
58+
59+
importantContests = dynamicSort(importantContests, [
60+
{ property: 'important', order: 'desc' },
61+
{ property: 'luck', order: 'desc' }
62+
]);
63+
64+
let total = 0;
65+
const size = importantContests.length;
66+
const cut = Math.min(k, size);
67+
68+
for (let i = 0; i < cut; i++) {
69+
total += importantContests[i].luck;
70+
}
71+
72+
for (let i = cut; i < size; i++) {
73+
total -= importantContests[i].luck;
74+
}
75+
76+
nonimportantContests.forEach((contest) => {
77+
total += contest.luck;
78+
});
79+
80+
return total;
81+
}
82+
83+
export default { luckBalance };

0 commit comments

Comments
 (0)