diff --git a/src/main/java/io/takima/Yatzy.java b/src/main/java/io/takima/Yatzy.java
index 0b594f00b56962aba16fd24904c762ef38c48169..d8b6f7960bc5e18a0a5cd800a7e8c2f1e499832d 100644
--- a/src/main/java/io/takima/Yatzy.java
+++ b/src/main/java/io/takima/Yatzy.java
@@ -66,6 +66,14 @@ public final class Yatzy {
         return pairs.get(0) + pairs.get(1);
     }
 
+    public static int threeOfAKind(Roll roll) {
+        return roll.countByDiceValueStream()
+            .filter(entry -> entry.getValue() >= 3)
+            .max(Map.Entry.comparingByKey())
+            .map(entry -> entry.getKey() * 3)
+            .orElse(0);
+    }
+
     public static int fourOfAKind(Roll roll) {
         return roll.countByDiceValueStream()
             .filter(entry -> entry.getValue() >= 4)
@@ -74,22 +82,6 @@ public final class Yatzy {
             .orElse(0);
     }
 
-    public static int threeOfAKind(int d1, int d2, int d3, int d4, int d5) {
-        int[] counts;
-        counts = new int[6];
-        counts[d1 - 1]++;
-        counts[d2 - 1]++;
-        counts[d3 - 1]++;
-        counts[d4 - 1]++;
-        counts[d5 - 1]++;
-        for (int i = 0; i < 6; i++) {
-            if (counts[i] >= 3) {
-                return (i + 1) * 3;
-            }
-        }
-        return 0;
-    }
-
     public static int smallStraight(int d1, int d2, int d3, int d4, int d5) {
         int[] counts;
         counts = new int[6];
diff --git a/src/test/java/io/takima/YatzyTest.java b/src/test/java/io/takima/YatzyTest.java
index 18c976255abebc9341e5fdbe800495056e8f3595..8c07f444a7c02bfcb5848eea7690145fdbc2d5f3 100644
--- a/src/test/java/io/takima/YatzyTest.java
+++ b/src/test/java/io/takima/YatzyTest.java
@@ -106,16 +106,16 @@ class YatzyTest {
     @Test
     void threeOfAKindShouldSumTheThreeDiceWithTheSameValue() {
         assertAll(
-            () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 4, 5)),
-            () -> assertEquals(15, Yatzy.threeOfAKind(5, 3, 5, 4, 5)),
-            () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 3, 5)),
-            () -> assertEquals(9, Yatzy.threeOfAKind(3, 3, 3, 3, 3))
+            () -> assertEquals(9, Yatzy.threeOfAKind(roll(3, 3, 3, 4, 5))),
+            () -> assertEquals(15, Yatzy.threeOfAKind(roll(5, 3, 5, 4, 5))),
+            () -> assertEquals(9, Yatzy.threeOfAKind(roll(3, 3, 3, 3, 5))),
+            () -> assertEquals(9, Yatzy.threeOfAKind(roll(3, 3, 3, 3, 3)))
         );
     }
 
     @Test
     void threeOfAKindShouldReturnZeroIfThereIsNoThreeDiceWithTheSameValue() {
-        assertEquals(0, Yatzy.threeOfAKind(3, 3, 4, 5, 6));
+        assertEquals(0, Yatzy.threeOfAKind(roll(3, 3, 4, 5, 6)));
     }
 
     @Test