diff --git a/knoda/src/C018_Recipe.java b/knoda/src/C018_Recipe.java new file mode 100644 index 0000000000000000000000000000000000000000..97873d42db00835d905e438b83387c7f6fd5f23a --- /dev/null +++ b/knoda/src/C018_Recipe.java @@ -0,0 +1,66 @@ +package hellojunit; + +import java.util.ArrayList; +import java.util.LinkedHashMap; +import java.util.List; +import java.util.Map; +import java.util.Scanner; +import java.util.Set; + +public class C018_Recipe { + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + + // foodstuffMap : レシピに書かれている食材とその個数が格納されるマップ + final Map foodstuffMap = new LinkedHashMap(); + + // レシピに書かれている食材の個数を入力 + int foodstuffOfRecipeNum = scan.nextInt(); + + // レシピに書かれているそれぞれの食材とその個数を入力 + for (int foodstuff = 0; foodstuff < foodstuffOfRecipeNum; foodstuff++) { + String foodstuffName = scan.next(); + int foodstuffNum = scan.nextInt(); + foodstuffMap.put(foodstuffName, foodstuffNum); + } + + // haveFoodstuffMap : 自身が所持している食材とその個数が格納されるマップ + final Map haveFoodstuffMap = new LinkedHashMap(); + + // 自身が所持している食材の個数を入力 + int haveFoodstuffNum = scan.nextInt(); + + // 自身が所持しているそれぞれの食材とその個数を入力 + for (int foodstuff = 0; foodstuff < haveFoodstuffNum; foodstuff++) { + String foodstuffName = scan.next(); + int foodstuffNum = scan.nextInt(); + haveFoodstuffMap.put(foodstuffName, foodstuffNum); + } + + // 何人前のレシピを作ることができるかを取得する + int people = howManyService(foodstuffMap, haveFoodstuffMap); + System.out.println(people); + + scan.close(); + } + + // 何人前のレシピを作ることができるかを取得するメソッド + static int howManyService(final Map foodstuffMap, final Map haveFoodstuffMap) { + final Set foodstuffSet = foodstuffMap.keySet(); + + if (haveFoodstuffMap.keySet().containsAll(foodstuffMap.keySet())) { + + int people = 10000; + for (String foodstuff : foodstuffSet) { + int foodstuffPeople = haveFoodstuffMap.get(foodstuff) / foodstuffMap.get(foodstuff); + if (people > foodstuffPeople) { + people = foodstuffPeople; + } + } + return people; + } else { + return 0; + } + } +} diff --git a/knoda/src/C065_AnswerNumber.class b/knoda/src/C065_AnswerNumber.class new file mode 100644 index 0000000000000000000000000000000000000000..123ca7f334f30bc4dfdd83fffbc0a621af717bf7 Binary files /dev/null and b/knoda/src/C065_AnswerNumber.class differ diff --git a/knoda/src/C065_AnswerNumber.java b/knoda/src/C065_AnswerNumber.java new file mode 100644 index 0000000000000000000000000000000000000000..ac3d30051a40833d793ce35a633b74f0e2a9a9a4 --- /dev/null +++ b/knoda/src/C065_AnswerNumber.java @@ -0,0 +1,106 @@ +package hellojunit; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class C065_AnswerNumber { + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + + // ヒントの数を入力 + final int hintNum = scan.nextInt(); + + /* symbolList : 記号(<、>、/)が格納されているリスト + * numList : 整数が格納されているリスト + */ + final List symbolList = new ArrayList(); + final List numList = new ArrayList(); + + // 記号と整数を入力 + for (int hint = 0; hint < hintNum; hint++) { + symbolList.add(scan.next()); + numList.add(scan.nextInt()); + } + + final int answer = getAnswer(symbolList, numList); + System.out.println(answer); + scan.close(); + } + + // ヒントの条件を満たす整数を取得するメソッド + static int getAnswer(List symbolList, List numList) { + final List answerCandidateNumList + = hintCalculation(symbolList, numList); + + int answer = 0; + + // 整数がいくつ条件を満たしているか数える + for (Integer num : answerCandidateNumList) { + long numCount = answerCandidateNumList + .stream() + .filter(n -> n == num) + .count(); + + // 整数がすべての条件を満たしているとき + if (numCount == symbolList.size()) { + answer = num; + break; + } + } + return answer; + } + + // ヒントの記号によって取得方法を変えるメソッド + static List hintCalculation(List symbolList, List numList) { + + // 1つでもヒントの条件を満たす整数を格納するリスト + List answerCandidateNumList = new ArrayList(); + + for (int hint = 0; hint < symbolList.size(); hint++) { + for (int num = 1; num <= 100; num++) { + + // ヒントの記号が「>」「<」「/」のみのとき + if (symbolList.contains(">") || symbolList.contains("<") + || symbolList.contains("/")) { + answerCandidateNumList = calculation( + symbolList.get(hint), numList.get(hint), + num, answerCandidateNumList); + } else { + removeList(answerCandidateNumList); + break; + } + } + } + return answerCandidateNumList; + } + + // ヒントの条件を満たすための計算処理メソッド + static List calculation(String symbol, int hintNum, + int num, List answerCandidateNumList) { + + // ヒントの条件を満たしているかを判定 + if (">".equals(symbol)) { + if (num > hintNum) { + answerCandidateNumList.add(num); + } + } else if ("<".equals(symbol)) { + if (num < hintNum) { + answerCandidateNumList.add(num); + } + } else if ("/".equals(symbol)) { + if (num % hintNum == 0) { + answerCandidateNumList.add(num); + } + } + return answerCandidateNumList; + } + + // リストの中身を削除するメソッド + static void removeList(List list) { + while (list.size() > 0) { + list.remove(0); + } + } +} diff --git a/knoda/test/C018_RecipeTest.java b/knoda/test/C018_RecipeTest.java new file mode 100644 index 0000000000000000000000000000000000000000..aeab96fd74b3573ca95fe32a21e7acba4de9ae0a --- /dev/null +++ b/knoda/test/C018_RecipeTest.java @@ -0,0 +1,73 @@ +package hellojunit; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +public class C018_RecipeTest { + + @Test + public void 出力が2になるテスト() { + Map foodstuffMap = new LinkedHashMap(); + Map haveFoodstuffMap = new LinkedHashMap(); + + foodstuffMap.put("supaisu", 5); + foodstuffMap.put("imo", 2); + foodstuffMap.put("niku", 2); + foodstuffMap.put("mizu", 3); + + haveFoodstuffMap.put("mizu", 7); + haveFoodstuffMap.put("imo", 4); + haveFoodstuffMap.put("ninjin", 10); + haveFoodstuffMap.put("unagi", 6); + haveFoodstuffMap.put("supaisu", 20); + haveFoodstuffMap.put("niku", 5); + + int actual = C018_Recipe.howManyService(foodstuffMap, haveFoodstuffMap); + int expected = 2; + assertThat(actual, is(expected)); + } + + @Test + public void 出力が3になるテスト() { + Map foodstuffMap = new LinkedHashMap(); + Map haveFoodstuffMap = new LinkedHashMap(); + + foodstuffMap.put("supaisu", 5); + foodstuffMap.put("imo", 2); + foodstuffMap.put("niku", 2); + foodstuffMap.put("mizu", 3); + + haveFoodstuffMap.put("mizu", 10); + haveFoodstuffMap.put("imo", 4); + haveFoodstuffMap.put("supaisu", 20); + haveFoodstuffMap.replace("imo", haveFoodstuffMap.get("imo") + 2); + haveFoodstuffMap.put("niku", 1); + haveFoodstuffMap.replace("niku", haveFoodstuffMap.get("niku") + 5); + + int actual = C018_Recipe.howManyService(foodstuffMap, haveFoodstuffMap); + int expected = 3; + assertThat(actual, is(expected)); + } + + @Test + public void 出力が0になるテスト() { + Map foodstuffMap = new LinkedHashMap(); + Map haveFoodstuffMap = new LinkedHashMap(); + + foodstuffMap.put("gohan", 1); + foodstuffMap.put("okazu", 1); + + haveFoodstuffMap.put("mizu", 10000); + + int actual = C018_Recipe.howManyService(foodstuffMap, haveFoodstuffMap); + int expected = 0; + assertThat(actual, is(expected)); + } +} diff --git a/knoda/test/C065_AnswerNumberTest.java b/knoda/test/C065_AnswerNumberTest.java new file mode 100644 index 0000000000000000000000000000000000000000..1cf005d26acb702b7ff10e034f66a1f498ba4d56 --- /dev/null +++ b/knoda/test/C065_AnswerNumberTest.java @@ -0,0 +1,106 @@ +package hellojunit; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; +import org.junit.experimental.runners.Enclosed; +import org.junit.runner.RunWith; + +@RunWith(Enclosed.class) +public class C065_AnswerNumberTest { + + public static class + ヒントの記号が大なり小なりスラッシュのみかつ正の整数が100以下のとき { + + List symbolList; + List numList; + + @Test + public void 出力が35になるテスト() { + symbolList = new ArrayList(Arrays.asList(">", "<", "/")); + numList = new ArrayList(Arrays.asList(30, 40, 5)); + int actual = C065_AnswerNumber.getAnswer(symbolList, numList); + int expected = 35; + assertThat(actual, is(expected)); + } + + @Test + public void 出力が84になるテスト() { + symbolList = new ArrayList(Arrays.asList("/", "<", "/", ">")); + numList = new ArrayList(Arrays.asList(4, 90, 6, 77)); + int actual = C065_AnswerNumber.getAnswer(symbolList, numList); + int expected = 84; + assertThat(actual, is(expected)); + } + } + + public static class + ヒントの記号が大なり小なりスラッシュ以外を含むとき { + + List symbolList; + List numList; + + @Test + public void 出力が0になるテスト1() { + symbolList = new ArrayList(Arrays.asList(">", "<", "/", "+")); + numList = new ArrayList(Arrays.asList(30, 40, 5, 4)); + int actual = C065_AnswerNumber.getAnswer(symbolList, numList); + int expected = 0; + assertThat(actual, is(expected)); + } + + @Test + public void 出力が0になるテスト2() { + symbolList = new ArrayList(Arrays.asList("/", "<", "*", "/", ">")); + numList = new ArrayList(Arrays.asList(4, 90, 12, 6, 77)); + int actual = C065_AnswerNumber.getAnswer(symbolList, numList); + int expected = 0; + assertThat(actual, is(expected)); + } + } + + public static class + ヒントが100以上の整数を含むとき { + + List symbolList; + List numList; + + @Test + public void 出力が0になるテスト() { + symbolList = new ArrayList(Arrays.asList("/", "<", "/", ">")); + numList = new ArrayList(Arrays.asList(20, 200, 5, 100)); + int actual = C065_AnswerNumber.getAnswer(symbolList, numList); + int expected = 0; + assertThat(actual, is(expected)); + } + + } + + public static class 条件を満たす整数が一意でない { + List symbolList; + List numList; + + @Test + public void 出力が32と36の2つあるのに32のみが出力されるテスト() { + symbolList = new ArrayList(Arrays.asList(">", "<", "/")); + numList = new ArrayList(Arrays.asList(30, 40, 4)); + int actual = C065_AnswerNumber.getAnswer(symbolList, numList); + int expected = 32; + assertThat(actual, is(expected)); + } + + @Test + public void 出力が15の倍数すべてがあるのに15のみが出力されるテスト() { + symbolList = new ArrayList(Arrays.asList("/", "/")); + numList = new ArrayList(Arrays.asList(3, 5)); + int actual = C065_AnswerNumber.getAnswer(symbolList, numList); + int expected = 15; + assertThat(actual, is(expected)); + } + } +}