diff --git a/rsuzuki/README.md b/rsuzuki/README.md new file mode 100644 index 0000000000000000000000000000000000000000..796c95d353f961f632c60d81ef2bdf62fa8ea5ff --- /dev/null +++ b/rsuzuki/README.md @@ -0,0 +1,2 @@ +# Paiza +knoda用 diff --git a/rsuzuki/src/B158_stone.java b/rsuzuki/src/B158_stone.java new file mode 100644 index 0000000000000000000000000000000000000000..6da7cf01691cf2de64112a893488f5bf4cc4e956 --- /dev/null +++ b/rsuzuki/src/B158_stone.java @@ -0,0 +1,92 @@ +package paiza_c; + +import java.util.Scanner; + +/** データを保持するクラス */ +final class StoneData { + private final int boardNumber; + private final int[][] stoneAmount; + + /** + * インスタンスを生成 + * + * @param boardNumber 入力される一辺の板の数 + * @param stoneNumber 入力される石の数 + */ + public StoneData(int boardNumber, int[][] stoneAmount) { + this.boardNumber = boardNumber; + this.stoneAmount = stoneAmount; + } + + public int getBoardNumber() { + return boardNumber; + } + + public int getStoneAmount(int y, int x) { + return stoneAmount[y][x]; + } +} + +/** + * ロジック + * + */ +final class StoneLogic { + /** + * 盤面上の石の総数を計算し、各位置で取り除く必要のある石の数を合計して返す + * + * @param stoneData 石のデータを含むStoneDataオブジェクト + * @return 取り除く必要のある石の合計数 + */ + public int calculateTotalStoneToRemove(StoneData stoneData) { + int totalStoneRemove = 0; + int boardNumber = stoneData.getBoardNumber();// stoneDataから取得 + + for (int i = 0; i < boardNumber; i++) { + for (int j = 0; j < boardNumber; j++) { + // 配列のインデックス (0から始まる) を、計算で使用する1から始まる座標に変換 + int row = i + 1; + int col = j + 1; + + // プレートが属するレイヤー番号を計算 + // レイヤー番号は、外側のレイヤーから内側に向かって1から(N+1)/2まで + int layer = Math.min(Math.min(row, col), Math.min(boardNumber - row + 1, boardNumber - col + 1)); + + // そのプレートに必要な石の数を計算 + int requiredStones = layer; + + // 現在の場所の石の数 + int currentStones = stoneData.getStoneAmount(i, j); + + // 取り除く必要のある石の数を計算し、合計に追加 + totalStoneRemove += (currentStones - requiredStones); + } + } + return totalStoneRemove; + } +} + +/** メイン */ +public class B158_stone { + + public static void main(String[] args) { + final Scanner sc = new Scanner(System.in); + final int boardNumber = sc.nextInt(); + + final int stoneAmount[][] = new int[boardNumber][boardNumber]; + for (int i = 0; i < boardNumber; i++) { + for (int j = 0; j < boardNumber; j++) { + stoneAmount[i][j] = sc.nextInt(); + } + } + + sc.close(); + + final StoneLogic stoneLogic = new StoneLogic(); + final StoneData stoneData = new StoneData(boardNumber, stoneAmount); + + System.out.println(stoneLogic.calculateTotalStoneToRemove(stoneData)); + + } + +}