Skip to content

Commit 46abedd

Browse files
author
Gonzalo Diaz
committed
[Hacker Rank] Interview Preparation Kit: Dictionaries and Hashmaps: Count Triplets. Solved ✓.
1 parent 0978443 commit 46abedd

File tree

6 files changed

+194
-0
lines changed

6 files changed

+194
-0
lines changed
Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
// @link Problem definition [[docs/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/ctci-ransom-note.md]]
2+
3+
namespace algorithm_exercises_csharp.hackerrank.interview_preparation_kit.dictionaries_and_hashmaps;
4+
5+
using System.Collections.Generic;
6+
7+
public class CountTriplets
8+
{
9+
public static long countTriplets(List<long> arr, long r)
10+
{
11+
Dictionary<long, long> aCounter = [];
12+
Dictionary<long, long> bCounter = [];
13+
long triplets = 0L;
14+
15+
foreach (long item in arr)
16+
{
17+
aCounter[item] = aCounter.TryGetValue(item, out long value) ? value + 1L : 1L;
18+
}
19+
20+
long prevItemCount;
21+
long nextItemCount;
22+
23+
foreach (long item in arr)
24+
{
25+
long j = item / r;
26+
long k = item * r;
27+
28+
aCounter[item] = aCounter[item] - 1L;
29+
30+
prevItemCount = bCounter.TryGetValue(j, out long bItem) ? bItem : 0L;
31+
nextItemCount = aCounter.TryGetValue(k, out long aItem) ? aItem : 0L;
32+
if (item % r == 0)
33+
{
34+
triplets += prevItemCount * nextItemCount;
35+
}
36+
37+
bCounter[item] = bCounter.TryGetValue(item, out long currentItemCount) ? currentItemCount + 1L : 1L;
38+
}
39+
40+
return triplets;
41+
}
42+
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
// @link Problem definition [[docs/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/ctci-ransom-note.md]]
2+
3+
namespace algorithm_exercises_csharp.hackerrank.interview_preparation_kit.dictionaries_and_hashmaps;
4+
5+
using System.Diagnostics.CodeAnalysis;
6+
using System.Collections.Generic;
7+
8+
public class CountTripletsBruteForce
9+
{
10+
public static long countTriplets(List<long> arr, long r)
11+
{
12+
long size = arr.Count;
13+
long counter = 0L;
14+
15+
for (int i = 0; i < size - 2; i++)
16+
{
17+
for (int j = i + 1; j < size - 1; j++)
18+
{
19+
for (int k = j + 1; k < size; k++)
20+
{
21+
22+
if (r * arr[i] == arr[j] && r * arr[j] == arr[k])
23+
{
24+
counter += 1;
25+
}
26+
}
27+
}
28+
}
29+
30+
return counter;
31+
}
32+
}

src/algorithm_exercises_csharp_test/Resources/hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/count_triplets_1.big.testcases.json

Lines changed: 9 additions & 0 deletions
Large diffs are not rendered by default.
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
[
2+
{
3+
"title": "Sample Test Case 0",
4+
"input": [1, 2, 2, 4],
5+
"r": 2,
6+
"expected": 2
7+
},
8+
{
9+
"title": "Sample Test Case 1",
10+
"input": [1, 3, 9, 9, 27, 81],
11+
"r": 3,
12+
"expected": 6
13+
},
14+
{
15+
"title": "Sample Test Case 1 (unsorted)",
16+
"input": [9, 3, 1, 81, 9, 27],
17+
"r": 3,
18+
"expected": 1
19+
},
20+
{
21+
"title": "Sample Test Case 12",
22+
"input": [1, 5, 5, 25, 125],
23+
"r": 5,
24+
"expected": 4
25+
}
26+
]
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
namespace algorithm_exercises_csharp_test.hackerrank.interview_preparation_kit.dictionaries_and_hashmaps;
2+
using algorithm_exercises_csharp_test.lib;
3+
using algorithm_exercises_csharp.hackerrank.interview_preparation_kit.dictionaries_and_hashmaps;
4+
5+
[TestClass]
6+
public class CountTripletsTest
7+
{
8+
public class CountTripletsTestCase
9+
{
10+
public string title { get; set; } = default!;
11+
public List<long> input { get; set; } = default!;
12+
public int r { get; set; } = default!;
13+
public long expected { get; set; } = default!;
14+
}
15+
16+
private List<CountTripletsTestCase> testCases { get; set; } = default!;
17+
private List<CountTripletsTestCase> bigTestCases { get; set; } = default!;
18+
19+
[TestInitialize]
20+
public void testInitialize()
21+
{
22+
testCases = JsonLoader.resourceLoad<List<CountTripletsTestCase>>(
23+
"hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/count_triplets_1.small.testcases.json"
24+
) ?? [];
25+
26+
bigTestCases = JsonLoader.resourceLoad<List<CountTripletsTestCase>>(
27+
"hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/count_triplets_1.big.testcases.json"
28+
) ?? [];
29+
}
30+
31+
[TestMethod]
32+
public void testCountTriplets()
33+
{
34+
long result;
35+
36+
foreach (CountTripletsTestCase test in testCases)
37+
{
38+
result = CountTriplets.countTriplets(test.input, test.r);
39+
Assert.AreEqual(test.expected, result);
40+
}
41+
42+
foreach (CountTripletsTestCase test in bigTestCases)
43+
{
44+
result = CountTriplets.countTriplets(test.input, test.r);
45+
Assert.AreEqual(test.expected, result);
46+
}
47+
}
48+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
namespace algorithm_exercises_csharp_test.hackerrank.interview_preparation_kit.dictionaries_and_hashmaps;
2+
using algorithm_exercises_csharp_test.lib;
3+
using algorithm_exercises_csharp.hackerrank.interview_preparation_kit.dictionaries_and_hashmaps;
4+
5+
[TestClass]
6+
public class CountTripletsBruteForceTest
7+
{
8+
public class CountTripletsBruteForceTestCase
9+
{
10+
public string title { get; set; } = default!;
11+
public List<long> input { get; set; } = default!;
12+
public int r { get; set; } = default!;
13+
public int expected { get; set; } = default!;
14+
}
15+
16+
private List<CountTripletsBruteForceTestCase> testCases { get; set; } = default!;
17+
18+
[TestInitialize]
19+
public void testInitialize()
20+
{
21+
testCases = JsonLoader.resourceLoad<List<CountTripletsBruteForceTestCase>>(
22+
"hackerrank/interview_preparation_kit/dictionaries_and_hashmaps/count_triplets_1.small.testcases.json"
23+
) ?? [];
24+
}
25+
26+
[TestMethod]
27+
public void testCountTriplets()
28+
{
29+
long result;
30+
31+
foreach (CountTripletsBruteForceTestCase test in testCases)
32+
{
33+
result = CountTripletsBruteForce.countTriplets(test.input, test.r);
34+
Assert.AreEqual(test.expected, result);
35+
}
36+
}
37+
}

0 commit comments

Comments
 (0)