diff --git a/knoda/src/B073_Illumination.java b/knoda/src/B073_Illumination.java new file mode 100644 index 0000000000000000000000000000000000000000..f1017fb3094e93a2ba161aa78b4b3cabcd2e2513 --- /dev/null +++ b/knoda/src/B073_Illumination.java @@ -0,0 +1,68 @@ +package hellojunit; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class B073_Illumination { + + public static void main(String[] args) { + final Scanner scan = new Scanner(System.in); + final int treeNum = scan.nextInt(); + final int baseLightBulbNum = scan.nextInt(); // 安全基準を満たす電球の個数 + List lightBulbList = new ArrayList(); // それぞれの木に存在する電球の個数 + for (int i = 0; i < treeNum; i++) { + lightBulbList.add(scan.nextInt()); + } + final int sectionNum = scan.nextInt(); // 電球の数を調査したい区間の数 + + // 電球を調査したい区間の始点と終点を格納したリスト + final List> sectionList = new ArrayList>(); + + for (int i = 0; i < sectionNum; i++) { + final List section = new ArrayList(); + section.add(scan.nextInt()); // 始点 + section.add(scan.nextInt()); // 終点 + sectionList.add(section); + } + final IlluminationSearch illuminationSearch = new IlluminationSearch(); + // それぞれの木に存在する電球の個数を取得する + lightBulbList = illuminationSearch.getLightBulbList(lightBulbList, sectionList, baseLightBulbNum); + for (int i = 0; i < lightBulbList.size(); i++) { + System.out.print(lightBulbList.get(i)); + if (i != lightBulbList.size() - 1) { + System.out.print(" "); + } + } + scan.close(); + } + +} + +class IlluminationSearch { + private final int START_INDEX = 0; // 始点の要素番号 + private final int FINISH_INDEX = 1; // 終点の要素番号 + + // それぞれの木に存在する電球の個数を取得するメソッド + public List getLightBulbList(final List lightBulbList, final List> sectionList, + final int baseLightBulbNum) { + + // それぞれの区間で、追加する電球の個数を算出する + for (final List section : sectionList) { + int sum = 0; + int average; + // ある区間の電球の平均個数を算出する + for (int i = section.get(START_INDEX) - 1; i <= section.get(FINISH_INDEX) - 1; i++) { + sum += lightBulbList.get(i); + } + average = sum / (section.get(FINISH_INDEX) - section.get(START_INDEX) + 1); + // 平均個数が安全基準を満たす電球個数に達していないとき、区間に存在するすべての木に足りない電球分を追加する + if (average < baseLightBulbNum) { + for (int i = section.get(START_INDEX) - 1; i <= section.get(FINISH_INDEX) - 1; i++) { + lightBulbList.set(i, lightBulbList.get(i) + (baseLightBulbNum - average)); + } + } + } + return lightBulbList; + } +} diff --git a/knoda/test/B073_IlluminationTest.java b/knoda/test/B073_IlluminationTest.java new file mode 100644 index 0000000000000000000000000000000000000000..b94703e963cfbe3a088cb1a14025dd6798a42da9 --- /dev/null +++ b/knoda/test/B073_IlluminationTest.java @@ -0,0 +1,62 @@ +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; + +public class B073_IlluminationTest { + + @Test + public void 電球が追加されるテスト() { + List electricList = new ArrayList(Arrays.asList(4, 3, 6, 1, 3)); + final List> selectionList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList(1, 3)), + new ArrayList(Arrays.asList(1, 5)), + new ArrayList(Arrays.asList(2, 3)))); + final int baseElectricNum = 6; + IlluminationSearch illuminationSearch = new IlluminationSearch(); + final List actualList = illuminationSearch.getElectricList(electricList, selectionList, baseElectricNum); + final List expectedList = new ArrayList(Arrays.asList(8, 7, 10, 3, 5)); + for (int i = 0; i < actualList.size(); i++) { + assertThat(actualList.get(i), is(expectedList.get(i))); + } + } + + @Test + public void 電球が追加されないテスト() { + List electricList = new ArrayList(Arrays.asList(4, 3, 6, 1, 3)); + final List> selectionList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList(1, 3)), + new ArrayList(Arrays.asList(1, 5)), + new ArrayList(Arrays.asList(2, 3)))); + final int baseElectricNum = 3; + IlluminationSearch illuminationSearch = new IlluminationSearch(); + final List actualList = illuminationSearch.getElectricList(electricList, selectionList, baseElectricNum); + final List expectedList = new ArrayList(Arrays.asList(4, 3, 6, 1, 3)); + for (int i = 0; i < actualList.size(); i++) { + assertThat(actualList.get(i), is(expectedList.get(i))); + } + } + + @Test + public void 電球の基準値と平均値の比較に関する境界値テスト() { + List electricList = new ArrayList(Arrays.asList(4, 3, 6, 1, 3)); + final List> selectionList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList(1, 3)), // average:4, baseElectricNum:4 + new ArrayList(Arrays.asList(1, 5)), // average:3, baseElectricNum:4 + new ArrayList(Arrays.asList(2, 3)))); // average:5, baseElectricNum:4 + final int baseElectricNum = 4; + IlluminationSearch illuminationSearch = new IlluminationSearch(); + final List actualList = illuminationSearch.getElectricList(electricList, selectionList, baseElectricNum); + final List expectedList = new ArrayList(Arrays.asList(5, 4, 7, 2, 4)); + for (int i = 0; i < actualList.size(); i++) { + assertThat(actualList.get(i), is(expectedList.get(i))); + } + } + +}