diff --git a/knoda/src/B087_HiddenNumber.java b/knoda/src/B087_HiddenNumber.java new file mode 100644 index 0000000000000000000000000000000000000000..31180c931bfe0a91841bfc9837ea3f983400f8be --- /dev/null +++ b/knoda/src/B087_HiddenNumber.java @@ -0,0 +1,85 @@ +package hellojunit; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class B087_HiddenNumber { + + public static void main(String[] args) { + final Scanner scan = new Scanner(System.in); + final int height = scan.nextInt(); + final int width = scan.nextInt(); + final int digits = scan.nextInt(); + // マスに数字を入力する + final List board = new ArrayList(); + for (int i = 0; i < height; i++) { + board.add(scan.next()); + } + HiddenNumber hiddenNumber = new HiddenNumber(); + // 最大の数を取得する + final int max = hiddenNumber.getMaxNumber(board, digits); + System.out.println(max); + scan.close(); + } + +} + +class HiddenNumber { + private final int MIN_NUMBER = 1; // 値を比較するときに用いる初期値 + + // 最大の数を取得するメソッド + public int getMaxNumber(final List board, final int digits) { + int max = MIN_NUMBER; + max = getMaxNumber(board, digits, max); + // switchRowAndColumnBoard : マスの縦と横を入れ替えたときの状態 + final List switchRowAndColumnBoard = getSwitchRowAndColumn(board); + max = getMaxNumber(switchRowAndColumnBoard, digits, max); + return max; + } + + // それぞれの基盤(マスの縦と横を入れ替えた2つの基盤)の最大の数を取得するメソッド + private int getMaxNumber(final List board, final int digits, int max) { + for (final String row : board) { + for (int i = 0; i < row.length() - digits + 1; i++) { + final int number = exchangeStringForInteger(row, i, digits); + if (max < number) { + max = number; + } + } + } + return max; + } + + // マスの縦と横を入れ替えるメソッド + private List getSwitchRowAndColumn(final List board) { + final List switchRowAndColumn = new ArrayList(); + for (int i = 0; i < board.get(0).length(); i++) { + final List charList = new ArrayList(); + for (int j = 0; j < board.size(); j++) { + charList.add(board.get(j).charAt(i)); + } + switchRowAndColumn.add(exchangeCharForString(charList)); + } + return switchRowAndColumn; + } + + // 文字列を整数値に変換するメソッド + private int exchangeStringForInteger(final String row, final int startIndex, final int digits) { + final List charList = new ArrayList(); + for (int i = startIndex; i < startIndex + digits; i++) { + charList.add(row.charAt(i)); + } + return Integer.parseInt(exchangeCharForString(charList)); + } + + // 文字を文字列に変換するメソッド + private String exchangeCharForString(final List charList) { + StringBuilder sb = new StringBuilder(); + for (Character ch : charList) { + sb.append(ch); + } + return sb.toString(); + } + +} diff --git a/knoda/test/B087_HiddenNumberTest.java b/knoda/test/B087_HiddenNumberTest.java new file mode 100644 index 0000000000000000000000000000000000000000..359d3773412d0b123ae5ec63268826350892a8e3 --- /dev/null +++ b/knoda/test/B087_HiddenNumberTest.java @@ -0,0 +1,61 @@ +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 B087_HiddenNumberTest { + + @Test + public void テスト1() { + final List board = new ArrayList(Arrays.asList( + "66737", + "56173", + "59414", + "25469", + "63955" + )); + final int digits = 3; + HiddenNumber hiddenNumber = new HiddenNumber(); + final int expected = 955; + final int actual = hiddenNumber.getMaxNumber(board, digits); + assertThat(actual, is(expected)); + } + + @Test + public void 出力が87になるテスト() { + final List board = new ArrayList(Arrays.asList( + "77777", + "77777", + "77777", + "77778", + "77787" + )); + final int digits = 2; + HiddenNumber hiddenNumber = new HiddenNumber(); + final int expected = 87; + final int actual = hiddenNumber.getMaxNumber(board, digits); + assertThat(actual, is(expected)); + } + + @Test + public void 出力が9876になるテスト() { + final List board = new ArrayList(Arrays.asList( + "12345", + "54321", + "67891", + "19876" + )); + final int digits = 4; + HiddenNumber hiddenNumber = new HiddenNumber(); + final int expected = 9876; + final int actual = hiddenNumber.getMaxNumber(board, digits); + assertThat(actual, is(expected)); + } + +}