diff --git a/ksugawara/.gitignore b/ksugawara/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e10e727be5ce2dc48c7d4d86a401a2744e73c8c1 --- /dev/null +++ b/ksugawara/.gitignore @@ -0,0 +1 @@ +/.metadata/ diff --git a/ksugawara/src/HiddenNumber.java b/ksugawara/src/HiddenNumber.java new file mode 100644 index 0000000000000000000000000000000000000000..d7514cdad36e1e8f32c0bb23a63afa678c54646d --- /dev/null +++ b/ksugawara/src/HiddenNumber.java @@ -0,0 +1,94 @@ +package ksugawara; + +import java.util.Scanner; + +/** + * 決められた桁数の上から下、もしくは左から右に並んだ数字の最大値を求めるクラス. + */ + +public class HiddenNumber { + private static final int BASE_NUM = 10; // 最大値を求める計算上で使う基数の値 + private int maxValue = 0; // 最大値を格納する変数 + private int height; // マス目の縦の大きさ + private int width; // マス目の横の大きさ + private int digits; // 探す数の桁数 + private int[][] matrix; // マス目に書かれた数字を格納する二次元配列 + + /** + * 標準入力された値を変数や配列に格納する関数. + */ + public void storeInputValues() { + final Scanner sc = new Scanner(System.in); + this.height = sc.nextInt(); + this.width = sc.nextInt(); + this.digits = sc.nextInt(); + final String[] stringArray = new String[height]; + this.matrix = new int[height][width]; + + // 標準入力された二次元配列を一度文字列として一次元配列に格納する + for (int j = 0; j < height; j++) { + stringArray[j] = sc.next(); + } + + sc.close(); + + // 先ほどの文字列型の一次元配列を整数型で二次元配列に格納する + for (int row = 0; row < height; row++) { + for (int col = 0; col < width; col++) { + matrix[row][col] = Character.getNumericValue(stringArray[row].charAt(col)); + } + } + } + + // 横に並んだ数の最大値と縦に並んだ数の最大値の大きい方が整数型の値として返される関数。 + int getMaxValue() { + horizontalMaxValue(); + verticalMaxValue(); + return maxValue; + } + + // 横に並んだ数の最大値を求める関数 + void horizontalMaxValue() { + for (int row = 0; row < height; row++) { + for (int col = 0; col < width - digits + 1; col++) { + horizontalUnion(row, col); + } + } + } + + // 1234なら、1*1000+2*100+3*10+4*1と計算して、もし最大値を更新した場合、maxValueの値を上書きする関数 + void horizontalUnion(final int row, final int col) { + int sum = 0; + for (int i = 0; i < digits; i++) { + sum += matrix[row][col + i] * Math.pow(BASE_NUM, digits - i - 1); + } + + // これまでの最大値より高い値の場合更新する。 + if (maxValue < sum) { + maxValue = sum; + } + } + + // 縦に並んだ数の最大値を求める関数 + void verticalMaxValue() { + for (int col = 0; col < width; col++) { + for (int row = 0; row < height - digits + 1; row++) { + verticalUnion(col, row); + + } + } + } + + // 1\n2\n3\n4なら、1*1000+2*100+3*10+4*1のように計算する関数 + void verticalUnion(final int col, final int row) { + int sum = 0; + for (int i = 0; i < digits; i++) { + sum += matrix[row + i][col] * Math.pow(BASE_NUM, digits - i - 1); + } + + // これまでの最大値より高い値の場合更新する。 + if (maxValue < sum) { + maxValue = sum; + } + } +} diff --git a/ksugawara/src/HiddenNumberB087.java b/ksugawara/src/HiddenNumberB087.java new file mode 100644 index 0000000000000000000000000000000000000000..944cff017ac9eadd521cb5b319b57e6c75fd1132 --- /dev/null +++ b/ksugawara/src/HiddenNumberB087.java @@ -0,0 +1,18 @@ +package ksugawara; + +/** + * ksugawara 「B087隠された数」の回答プログラムのクラス. + */ + +public class HiddenNumberB087 { + + /** + * 与えられた条件を基に最大値を求めるプログラム. + */ + public static void main(final String[] args) { + final HiddenNumber hiddenNumber = new HiddenNumber(); + hiddenNumber.storeInputValues(); + final int maxValue = hiddenNumber.getMaxValue(); + System.out.println(maxValue); + } +}