From fbee42ddfa422704c6c5631464874e884e7c92ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E7=94=B0=20=E5=95=93=E4=BB=8B?= Date: Thu, 7 Jul 2022 11:22:27 +0900 Subject: [PATCH 1/2] =?UTF-8?q?C038=20=E3=81=8A=E8=8F=93=E5=AD=90=E3=81=AE?= =?UTF-8?q?=E5=88=86=E9=85=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knoda/src/C038_DivideSnack.java | 77 ++++++++++++++++++++++++++++ knoda/test/C038_DivideSnackTest.java | 43 ++++++++++++++++ 2 files changed, 120 insertions(+) create mode 100644 knoda/src/C038_DivideSnack.java create mode 100644 knoda/test/C038_DivideSnackTest.java diff --git a/knoda/src/C038_DivideSnack.java b/knoda/src/C038_DivideSnack.java new file mode 100644 index 0000000..2239ea7 --- /dev/null +++ b/knoda/src/C038_DivideSnack.java @@ -0,0 +1,77 @@ +package hellojunit; + +import java.util.LinkedHashMap; +import java.util.Map; +import java.util.Scanner; +import java.util.Set; + +public class C038_DivideSnack { + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + + // 機械の個数(machineNum)とお菓子の個数(snackNum)を入力する + final int machineNum = scan.nextInt(); + final int snackNum = scan.nextInt(); + + // containerMap : 機械の番号と容器の個数を格納するマップ + final Map containerMap = new LinkedHashMap(); + + // 機械ごとの容器の個数を入力 + for (int machineNO = 1; machineNO <= machineNum; machineNO++) { + int containerNum = scan.nextInt(); + containerMap.put(machineNO, containerNum); + } + + // お菓子のあまりが最も少ないかつ、容器が最も多い機械の番号を取得する + DivideSnack divideSnack = new DivideSnack(snackNum, containerMap); + final int machineNO = divideSnack.getMachineNO(); + System.out.println(machineNO); + scan.close(); + } + +} + +// お菓子を分配するクラス +class DivideSnack { + private static int snackNum; + private static Map containerMap; + + public DivideSnack(final int snackNum, final Map containerMap) { + DivideSnack.snackNum = snackNum; + DivideSnack.containerMap = containerMap; + } + + // お菓子のあまりが最も少ないかつ、容器が最も多い機械の番号を取得するメソッド + public int getMachineNO() { + Set machineNOSet = containerMap.keySet(); + + /* + * minRemainerSnack : すべての機械の中でお菓子のあまりが最も少ない数 + * maxContainer : お菓子のあまりが最も少ない機械の中で容器が最も多い数 + * machineNo : minRemainerSnackもしくはmaxContainerを満たす機械の番号 + */ + int minRemainerSnack = snackNum - 1; + int maxContainer = 1; + int machineNO = 1; + + // お菓子のあまりが最も少ないかつ、容器が最も多い機会の番号を探索する + for (Integer mNO : machineNOSet) { + final int remainerSnack = snackNum % containerMap.get(mNO); + + if (minRemainerSnack > remainerSnack) { + // お菓子のあまりが最も少ない機械が単独で存在するとき + minRemainerSnack = remainerSnack; + machineNO = mNO; + + } else if (minRemainerSnack == remainerSnack) { + // お菓子のあまりが最も少ない機械が複数存在するとき + if (maxContainer < containerMap.get(mNO)) { + maxContainer = containerMap.get(mNO); + machineNO = mNO; + } + } + } + return machineNO; + } +} diff --git a/knoda/test/C038_DivideSnackTest.java b/knoda/test/C038_DivideSnackTest.java new file mode 100644 index 0000000..e4e13bd --- /dev/null +++ b/knoda/test/C038_DivideSnackTest.java @@ -0,0 +1,43 @@ +package hellojunit; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import java.util.LinkedHashMap; +import java.util.Map; + +import org.junit.Test; + +public class C038_DivideSnackTest { + + @Test + public void お菓子のあまりが最も少ない機械が複数で存在するとき() { + Map containerMap = new LinkedHashMap(); + int snackNum = 7; + containerMap.put(1, 2); + containerMap.put(2, 3); + containerMap.put(3, 4); + + DivideSnack sut = new DivideSnack(snackNum, containerMap); + int expected = 2; + int actual = sut.getMachineNO(); + assertThat(actual, is(expected)); + } + + @Test + public void お菓子のあまりが最も少ない機械が単独で存在するとき() { + Map containerMap = new LinkedHashMap(); + int snackNum = 15; + containerMap.put(1, 12); + containerMap.put(2, 13); + containerMap.put(3, 7); + containerMap.put(4, 5); + containerMap.put(5, 8); + + DivideSnack sut = new DivideSnack(snackNum, containerMap); + int expected = 4; + int actual = sut.getMachineNO(); + assertThat(actual, is(expected)); + } + +} -- GitLab From c2fb4b4658cb8954943568c8da5018b302c612b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E7=94=B0=20=E5=95=93=E4=BB=8B?= Date: Thu, 7 Jul 2022 15:39:50 +0900 Subject: [PATCH 2/2] =?UTF-8?q?C038=20=E3=81=8A=E8=8F=93=E5=AD=90=E3=81=AE?= =?UTF-8?q?=E5=88=86=E9=85=8D=E3=81=AE=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knoda/src/C038_DivideSnack.java | 16 ++++++++-------- knoda/test/C038_DivideSnackTest.java | 4 ++-- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/knoda/src/C038_DivideSnack.java b/knoda/src/C038_DivideSnack.java index 2239ea7..fa561c7 100644 --- a/knoda/src/C038_DivideSnack.java +++ b/knoda/src/C038_DivideSnack.java @@ -24,8 +24,8 @@ public class C038_DivideSnack { } // お菓子のあまりが最も少ないかつ、容器が最も多い機械の番号を取得する - DivideSnack divideSnack = new DivideSnack(snackNum, containerMap); - final int machineNO = divideSnack.getMachineNO(); + SnackDivider snackDivider = new SnackDivider(snackNum, containerMap); + final int machineNO = snackDivider.getMachineNO(); System.out.println(machineNO); scan.close(); } @@ -33,13 +33,13 @@ public class C038_DivideSnack { } // お菓子を分配するクラス -class DivideSnack { - private static int snackNum; - private static Map containerMap; +class SnackDivider { + private int snackNum; + private Map containerMap; - public DivideSnack(final int snackNum, final Map containerMap) { - DivideSnack.snackNum = snackNum; - DivideSnack.containerMap = containerMap; + public SnackDivider(final int snackNum, final Map containerMap) { + this.snackNum = snackNum; + this.containerMap = containerMap; } // お菓子のあまりが最も少ないかつ、容器が最も多い機械の番号を取得するメソッド diff --git a/knoda/test/C038_DivideSnackTest.java b/knoda/test/C038_DivideSnackTest.java index e4e13bd..4aaabdf 100644 --- a/knoda/test/C038_DivideSnackTest.java +++ b/knoda/test/C038_DivideSnackTest.java @@ -18,7 +18,7 @@ public class C038_DivideSnackTest { containerMap.put(2, 3); containerMap.put(3, 4); - DivideSnack sut = new DivideSnack(snackNum, containerMap); + SnackDivider sut = new SnackDivider(snackNum, containerMap); int expected = 2; int actual = sut.getMachineNO(); assertThat(actual, is(expected)); @@ -34,7 +34,7 @@ public class C038_DivideSnackTest { containerMap.put(4, 5); containerMap.put(5, 8); - DivideSnack sut = new DivideSnack(snackNum, containerMap); + SnackDivider sut = new SnackDivider(snackNum, containerMap); int expected = 4; int actual = sut.getMachineNO(); assertThat(actual, is(expected)); -- GitLab