diff --git a/sitou/src/B145_BINGO.java b/sitou/src/B145_BINGO.java new file mode 100644 index 0000000000000000000000000000000000000000..240b09120b7cf8f436b32848a11fc237e6f5371e --- /dev/null +++ b/sitou/src/B145_BINGO.java @@ -0,0 +1,193 @@ +package src; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class B145_BINGO { + public static void main(String[] args) { + B145_BINGO bingo = new B145_BINGO(); + bingo.execute(); + } + + public B145_BINGO() {} + + void execute() { + final InputData inputData = input(); + final Result result = solveBingo(inputData); + output(result); + } + + private static class InputData { + final int cardSize; + final List> originCard; + final List lotteryList; + + public InputData(final int cardSize, + final List> originCard, List lotteryList) { + this.cardSize = cardSize; + this.originCard = originCard; + this.lotteryList = lotteryList; + } + } + + private static InputData input() { + Scanner sc = new Scanner(System.in); + final int cardSize = sc.nextInt(); + final int lotteryCount = sc.nextInt(); + + final List> originCard = new ArrayList>(); + for (int i = 0; i < cardSize; i++) { + List list = new ArrayList<>(); + for (int j = 0; j < cardSize; j++) { + list.add(sc.nextInt()); + } + originCard.add(list); + } + + final List lotteryList = new ArrayList(); + for (int i = 0; i < lotteryCount; i++) { + lotteryList.add(sc.nextInt()); + } + + sc.close(); + return new InputData(cardSize, originCard, lotteryList); + } + + static Result solveBingo(InputData inputData) { + PunchCard p = new PunchCard(inputData.cardSize); + final List> punched_card = p.punch(inputData); + int result = p.countBingo(inputData.cardSize, punched_card); + + return new Result(result); + + } + + private static class Result { + final int numOfBingos; + + public Result(final int numOfBingos) { + this.numOfBingos = numOfBingos; + } + + int getNumOfBingos() { + return numOfBingos; + } + } + + private void output(final Result result) { + System.out.println(result.getNumOfBingos()); + } + + private static class PunchCard { + final List> punchCard = new ArrayList>(); + + public PunchCard(final int cardSize) { + for (int i = 0; i < cardSize; i++) { + List list = new ArrayList<>(); + for (int j = 0; j < cardSize; j++) { + list.add(0); + } + punchCard.add(list); + } + + } + + public List> punch(final InputData inputData) { + List> punched_card = new ArrayList>(); + + for (int i = 0; i < inputData.cardSize; i++) { + List list = (List) ((ArrayList) punchCard.get(i)).clone(); + punched_card.add(list); + } + + int center = (inputData.cardSize - 1) / 2; + punched_card.get(center).set(center, IS_OPENED); + + for (int lotteryNum : inputData.lotteryList) { + + for (int i = 0; i < inputData.cardSize; i++) { + for (int j = 0; j < inputData.cardSize; j++) { + if (lotteryNum == inputData.originCard.get(i).get(j)) { + punched_card.get(i).set(j, IS_OPENED); + } + } + } + + } + return punched_card; + } + + public int countBingo(final int cardSize, final List> punched_card) { + int result = 0; + result += countHorizontals(cardSize, punched_card); + result += countVerticals(cardSize, punched_card); + result += countDiagonals(cardSize, punched_card); + + return result; + } + + static final int IS_OPENED = 1; + + public int countHorizontals(final int cardSize, + final List> punched_card) { + int result = 0; + for (int i = 0; i < cardSize; i++) { + int countPunched = 0; + for (int j = 0; j < cardSize; j++) { + if (punched_card.get(i).get(j) == IS_OPENED) { + countPunched++; + } + } + if (countPunched == cardSize) { + result++; + } + } + return result; + } + + public int countVerticals(final int cardSize, + final List> punched_card) { + int result = 0; + for (int i = 0; i < cardSize; i++) { + int countPunched = 0; + for (int j = 0; j < cardSize; j++) { + if (punched_card.get(j).get(i) == IS_OPENED) { + countPunched++; + } + } + if (countPunched == cardSize) { + result++; + } + } + return result; + } + + public int countDiagonals(final int cardSize, + final List> punched_card) { + int result = 0; + int countPunchedBackSlashLine = 0; + int countPunchedSlashLine = 0; + int x = cardSize - 1; + for (int i = 0; i < cardSize; i++) { + + if (punched_card.get(i).get(i) == IS_OPENED) { // 左上から右下にチェック + countPunchedBackSlashLine++; + } + if (punched_card.get(i).get(x - i) == IS_OPENED) {// 右上から左下にチェック + countPunchedSlashLine++; + } + + } + if (countPunchedBackSlashLine == cardSize) { + result++; + } + if (countPunchedSlashLine == cardSize) { + result++; + } + + return result; + } + } + +}