diff --git a/yitou/src/SlimeKing.java b/yitou/src/SlimeKing.java new file mode 100644 index 0000000000000000000000000000000000000000..9553ed93c2e1e9d4e187808a619813bf8f9fb140 --- /dev/null +++ b/yitou/src/SlimeKing.java @@ -0,0 +1,55 @@ +package src; + +import java.util.Arrays; +import java.util.Scanner; + +public class SlimeKing { + public static void main(final String[] args) { + final Scanner scanner = new Scanner(System.in); + + // スライムの数と初期の大きさを取得 + final int totalSlimes = scanner.nextInt(); + final int initialSize = scanner.nextInt(); + final int[] sizes = new int[totalSlimes]; + + // スライムの大きさを取得 + for (int index = 0; index < totalSlimes; index++) { + sizes[index] = scanner.nextInt(); + } + + final int result = becomeKing(sizes, initialSize); + System.out.println(result); + } + + public static int becomeKing(final int[] sizes, final int initialSize) { + // スライムの大きさをソート + final int[] sortedSizes = Arrays.copyOf(sizes, sizes.length); // コピー作成 + Arrays.sort(sortedSizes); + int count = 0; + int currentSize = initialSize; + + final int maxSize = sortedSizes[sortedSizes.length - 1]; // 最大のスライムの大きさ + + while (currentSize <= maxSize) { + boolean found = false; + + // 自分の大きさ以下のスライムの中で最も大きいものを探す + for (int index = sortedSizes.length - 1; index >= 0; index--) { + if (sortedSizes[index] != -1 && sortedSizes[index] <= currentSize) { + currentSize += sortedSizes[index]; + count++; + sortedSizes[index] = -1; // 取り込んだスライム無効 + found = true; + break; + } + } + + // 取り込めるスライムがない場合 + if (!found) { + return -1; + } + } + + return count; + } +} diff --git a/yitou/test/SlimeKingTest.java b/yitou/test/SlimeKingTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0a5e8ce42132c5d0ff1a140dafc97e83966e4aaa --- /dev/null +++ b/yitou/test/SlimeKingTest.java @@ -0,0 +1,32 @@ +package test; + +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; +import src.SlimeKing; + +public class SlimeKingTest { + + @Test + public void 取り込みが成功し自分が一番大きなるとき() { + final int[] sizes = {10, 13, 15, 40}; + final int initialSize = 10; + final int expected = 3; + assertEquals(expected, SlimeKing.becomeKing(sizes, initialSize)); + } + + @Test + public void 取り込めるスライムがいないとき() { + final int[] sizes = {25, 30, 35}; + final int initialSize = 20; + final int expected = -1; + assertEquals(expected, SlimeKing.becomeKing(sizes, initialSize)); + } + + @Test + public void 最初から一番大きいとき() { + final int[] sizes = {10, 20, 25}; + final int initialSize = 30; + final int expected = 0; + assertEquals(expected, SlimeKing.becomeKing(sizes, initialSize)); + } +}