diff --git a/rooki/B129.java b/rooki/B129.java new file mode 100644 index 0000000000000000000000000000000000000000..fbb0d038a17d0780fd89f4bcd6e8ffd1d28f8fd0 --- /dev/null +++ b/rooki/B129.java @@ -0,0 +1,173 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** + * 農場作業が終わった後の収穫個数と作物状況を出力. + * + * @author rooki + * @version 4.0 + */ +public class B129 { + + /** + * mainメソッド. + * + * @param args 使用しない + */ + public static void main(final String[] args) { + final FarmInfo farmer = FarmInfo.createFrom(new Scanner(System.in)); + + harvestCrops(farmer); + + final StringBuilder result = outputResult(farmer); + + System.out.print(result); + } + + /** + * 収穫作業を行う. + * + * @param farmer 農場の情報を持つ + */ + public static void harvestCrops(final FarmInfo farmer) { + // 作業回数 + for (FarmInfo.Working work : farmer.works) { + for (int row = work.rowStartRange; row <= work.rowEndRange; row++) { + for (int column = work.columnStartRange; column <= work.columnEndRange; column++) { + + countCrops(farmer, row, column); + // 指定範囲に指定作物を植える + farmer.farmMap[row - 1][column - 1] = work.plantCrop; + } + } + } + } + + /** + * 作物の数を数える. + * + * @param farmer 農場の情報を持つ + * @param row 行数 + * @param column 列数 + */ + public static void countCrops(final FarmInfo farmer, int row, int column) { + // 作物を収穫し、数える + for (int i = 1; i <= farmer.categoryNumber; i++) { + // もし作物があれば収穫する + if (i == farmer.farmMap[row - 1][column - 1]) { + // 配列のインデックスと対応している箇所の作物の個数を増やす + farmer.crops[i - 1]++; + } + } + } + + /** + * 収穫できた個数、作業後の作物の情報を出力する. + * + * @param farmer 農場の情報を持つ + */ + public static StringBuilder outputResult(final FarmInfo farmer) { + final StringBuilder result = new StringBuilder(); + + for (int cropsType = 0; cropsType < farmer.categoryNumber; cropsType++) { + result + .append(farmer.crops[cropsType] + + "\r\n"); + } + + for (int[] rowRange : farmer.farmMap) { + for (int farmStatus : rowRange) { + if (farmStatus == 0) { + result.append("."); + } else { + result.append(farmStatus); + } + } + result.append("\r\n"); + } + return result; + } + + /** + * 農場の情報を持つクラス. + * + */ + static class FarmInfo { + final int workingTimes; + final int categoryNumber; + + //final int plantCrop; + final int[][] farmMap; + final int[] crops; + + final List works; + + /** + * 1回分の作業範囲の情報を持つクラス. + * + */ + static class Working { + int rowStartRange; + int rowEndRange; + int columnStartRange; + int columnEndRange; + int plantCrop; + + public Working(final int rowStartRange, final int rowEndRange, final int columnStartRange, + final int columnEndRange, final int plantCrop) { + this.rowStartRange = rowStartRange; + this.rowEndRange = rowEndRange; + this.columnStartRange = columnStartRange; + this.columnEndRange = columnEndRange; + this.plantCrop = plantCrop; + } + + } + + /** + * テストコードで呼び出す際に利用するコンストラクタ. + */ + public FarmInfo(int workingTimes, int categoryNumber, int[][] farmMap, int[] crops, + List works) { + this.workingTimes = workingTimes; + this.categoryNumber = categoryNumber; + this.farmMap = farmMap; + this.crops = crops; + this.works = works; + } + + /** + * Scannerからデータを読み込み、インスタンスを生成して返す. + * + * @param sc 読みこんだScanner + * @return 生成されたFarmInfoインスタンス + */ + public static FarmInfo createFrom(final Scanner sc) { + int workingTimes = sc.nextInt(); // 1年の作業回数 + int categoryNumber = sc.nextInt(); // 作物の種類数 + int rowCount = sc.nextInt(); // 行数 + int columnCount = sc.nextInt(); // 列数 + + int[][] farmMap = new int[rowCount][columnCount]; // 指定したサイズの農場 + int[] crops = new int[categoryNumber]; // 収穫した作物の個数を保存する配列 + + List works = new ArrayList<>(); + + for (int i = 0; i < workingTimes; i++) { + int rowStartRange = sc.nextInt(); + int rowEndRange = sc.nextInt(); + int columnStartRange = sc.nextInt(); + int columnEndRange = sc.nextInt(); + int cropType = sc.nextInt(); + works + .add(new Working(rowStartRange, rowEndRange, columnStartRange, columnEndRange, + cropType)); + } + sc.close(); + + return new FarmInfo(workingTimes, categoryNumber, farmMap, crops, works); + } + + } +} diff --git a/rooki/B129Test.java b/rooki/B129Test.java new file mode 100644 index 0000000000000000000000000000000000000000..8d24bb0c69b0016cefebe4d3b76ba30e9558edd4 --- /dev/null +++ b/rooki/B129Test.java @@ -0,0 +1,83 @@ +import static org.junit.Assert.*; +import java.util.ArrayList; +import java.util.List; +import org.junit.Test; + +/** + * B129のテストコード. + * + * @author rooki + * @version 4.0 + */ +public class B129Test { + + @Test + public void 植えられていない箇所に1を植えた際に最終状態が一致しているか() throws Exception { + int workingTimes = 1; + int categoryNumber = 2; + int[][] farmMap = new int[1][4]; + int[] crops = new int[2]; + + List works = new ArrayList<>(); + + works.add(new B129.FarmInfo.Working(1, 1, 1, 1, 1)); + B129.FarmInfo farmer = new B129.FarmInfo(workingTimes, categoryNumber, farmMap, crops, works); + + B129.harvestCrops(farmer); + + assertArrayEquals(new int[][] { + { + 1, 0, 0, 0 + } + }, farmer.farmMap); + } + + @Test + public void 作物1を1つ収穫した際に収穫数が一致しているか() throws Exception { + int workingTimes = 2; + int categoryNumber = 2; + int[][] farmMap = new int[1][4]; + int[] crops = new int[2]; + + List works = new ArrayList<>(); + + works.add(new B129.FarmInfo.Working(1, 1, 1, 1, 1)); + works.add(new B129.FarmInfo.Working(1, 1, 1, 1, 1)); + + B129.FarmInfo farmer = new B129.FarmInfo(workingTimes, categoryNumber, farmMap, crops, works); + + B129.harvestCrops(farmer); + + assertArrayEquals(new int[] { + 1, 0 + }, farmer.crops); + } + + @Test + public void outputResultが正しい文字列を生成するか() throws Exception { + int workingTimes = 0; + int categoryNumber = 2; + int[][] farmMap = { + { + 1, 2 + }, { + 0, 0 + } + }; + int[] crops = { + 10, 5 + }; + + List works = new ArrayList<>(); + + B129.FarmInfo farmer = new B129.FarmInfo(workingTimes, categoryNumber, farmMap, crops, works); + + StringBuilder actualResult = B129.outputResult(farmer); + + String expectedString = "10\r\n" + + "5\r\n" + + "12\r\n" + + "..\r\n"; + assertEquals(expectedString, actualResult.toString()); + } +}