From 41514aa10a419c942dd2f04e2b1592efd13119f8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=99=E9=8D=8B=20=E5=B0=9A=E8=BC=9D?= Date: Fri, 4 Jul 2025 17:14:54 +0900 Subject: [PATCH 1/3] =?UTF-8?q?paiza=E3=81=AE=E5=95=8F=E9=A1=8CB=5F136?= =?UTF-8?q?=E3=81=AE=E5=9B=9E=E7=AD=94?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ntakanabe/src/ValentineChocolate.java | 215 ++++++++++++++++++++++++++ 1 file changed, 215 insertions(+) create mode 100644 ntakanabe/src/ValentineChocolate.java diff --git a/ntakanabe/src/ValentineChocolate.java b/ntakanabe/src/ValentineChocolate.java new file mode 100644 index 0000000..9b3fd37 --- /dev/null +++ b/ntakanabe/src/ValentineChocolate.java @@ -0,0 +1,215 @@ +package paiza.src; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +/** + * . B136 バレンタインデーにチョコレートをもらうシミュレーション 指定された移動経路と各座席のチョコレートの数に基づいて、 + * 移動ごとに獲得したチョコレートの数を記録し、その結果を出力するクラス + * + * @author ntakanabe + */ +public class ValentineChocolate { + + /** + * . 標準入力から各データを読み込み、 + * チョコレート獲得処理メソッドを呼び出し、 + * その結果を出力メソッドに渡すmainメソッド + * + * @param args コマンドライン引数 + */ + public static void main(final String[] args) { + + final Scanner sc = new Scanner(System.in); + + // 移動回数moveCount、クラスの縦の席数height、横の席数width + final int moveCount = sc.nextInt(); + final int height = sc.nextInt(); + final int width = sc.nextInt(); + + // 自分の座席の開始位置startY(前から何列目か)、startX(左から何列目か) + final int startY = sc.nextInt() - 1; + final int startX = sc.nextInt() - 1; + + // 移動経路を表す文字列(F(前)、B(後)、L(左)、R(右)) + final String movePath = sc.next(); + + // 前からi列目、左からj列目にいるクラスメイトがくれるチョコレートの数 + final int[][] chocolates = new int[height][width]; + for (int i = 0; i < height; i++) { + for (int j = 0; j < width; j++) { + chocolates[i][j] = sc.nextInt(); + } + } + + final InputData inputData = new InputData(moveCount, height, width, startY, startX, movePath, + chocolates); + + final List getChocolates = moveProcess(inputData); + + outputResults(getChocolates); + + sc.close(); + } + + /** + * . 移動経路に基づいてチョコレートを獲得する処理メソッド + * + * @param moveCount 移動回数 + * @param startY 自分の座席の開始位置(行) + * @param startX 自分の座席の開始位置(列) + * @param movePath 移動経路を表す文字列 + * @param chocolates 各座席のチョコレートの数を格納した二次元配列 + * @return 獲得したチョコレートの数を順番に格納したリスト + */ + private static List moveProcess(final InputData inputData) { + + final List getChocolates = new ArrayList<>(); + + int currentY = inputData.getStartY(); + int currentX = inputData.getStartX(); + + // 移動経路に従ってチョコレートを獲得 + for (int i = 0; i < inputData.getMoveCount(); i++) { + final char move = inputData.getMovePath().charAt(i); + switch (move) { + case 'F': // 前方向 + currentY--; + break; + case 'B': // 後方向 + currentY++; + break; + case 'L': // 左方向 + currentX--; + break; + case 'R': // 右方向 + currentX++; + break; + default: + break; + } + getChocolates.add(inputData.getChocolate(currentY, currentX)); + } + return getChocolates; + } + + /** + * . 獲得したチョコレートの数を出力するメソッド + * + * @param chocolates 獲得したチョコレートの数を格納したリスト + */ + private static void outputResults(final List chocolates) { + for (int chocolate : chocolates) { + System.out.println(chocolate); + } + } + + /** + * . 入力データを保持するためのヘルパークラス + */ + private static class InputData { + private final int moveCount; + private final int height; + private final int width; + private final int startY; + private final int startX; + private final String movePath; + private final int[][] chocolates; + + /** + * . InputDataの新しいインスタンスを生成し、全てのフィールドを初期化するコンストラクタ + * + * @param moveCount 移動回数 + * @param height クラスの縦の席数 + * @param width クラスの横の席数 + * @param startY 自分の座席の開始行 + * @param startX 自分の座席の開始列 + * @param movePath 移動経路を表す文字列 + * @param chocolates 各座席のチョコレートの数を格納した二次元配列 + */ + public InputData(final int moveCount, final int height, final int width, + final int startY, final int startX, final String movePath, + final int[][] chocolates) { + + this.moveCount = moveCount; + this.height = height; + this.width = width; + this.startY = startY; + this.startX = startX; + this.movePath = movePath; + this.chocolates = chocolates; + } + + /** + * . 移動回数を取得 + * + * @return 移動回数 + */ + public int getMoveCount() { + + return moveCount; + } + + /** + * . クラスの縦の席数を取得 + * + * @return クラスの縦の席数 + */ + public int getHeight() { + + return height; + } + + /** + * . クラスの横の席数を取得 + * + * @return クラスの横の席数 + */ + public int getWidth() { + + return width; + } + + /** + * . 自分の座席の開始行を取得 + * + * @return 自分の座席の開始行 + */ + public int getStartY() { + return startY; + } + + /** + * . 自分の座席の開始列を取得 + * + * @return 自分の座席の開始列 + */ + public int getStartX() { + + return startX; + } + + /** + * . 移動経路を表す文字列を取得 + * + * @return 移動経路を表す文字列 + */ + public String getMovePath() { + + return movePath; + } + + /** + * . 指定された座標のチョコレートの数を取得 + * + * @param y 行インデックス + * @param x 列インデックス + * @return その座標(座席)にあるチョコレートの数 + */ + public int getChocolate(final int y, final int x) { + + return chocolates[y][x]; + } + } +} -- GitLab From dfbb19b99046be0ef3f779f718818ee4a789e1cc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=99=E9=8D=8B=20=E5=B0=9A=E8=BC=9D?= Date: Tue, 8 Jul 2025 10:08:48 +0900 Subject: [PATCH 2/3] =?UTF-8?q?paiza=E3=81=AE=E5=95=8F=E9=A1=8CB=5F136?= =?UTF-8?q?=E3=81=AE=E5=9B=9E=E7=AD=94=E3=82=92=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ntakanabe/src/ValentineChocolate.java | 85 +++++++++++++++++---------- 1 file changed, 53 insertions(+), 32 deletions(-) diff --git a/ntakanabe/src/ValentineChocolate.java b/ntakanabe/src/ValentineChocolate.java index 9b3fd37..17471d4 100644 --- a/ntakanabe/src/ValentineChocolate.java +++ b/ntakanabe/src/ValentineChocolate.java @@ -13,9 +13,7 @@ import java.util.Scanner; public class ValentineChocolate { /** - * . 標準入力から各データを読み込み、 - * チョコレート獲得処理メソッドを呼び出し、 - * その結果を出力メソッドに渡すmainメソッド + * . 標準入力から各データを読み込み、 チョコレート獲得処理メソッドを呼び出し、 その結果を出力メソッドに渡すmainメソッド * * @param args コマンドライン引数 */ @@ -43,14 +41,22 @@ public class ValentineChocolate { } } - final InputData inputData = new InputData(moveCount, height, width, startY, startX, movePath, - chocolates); + sc.close(); - final List getChocolates = moveProcess(inputData); + final InputRouteInfo inputRouteInfo = new InputRouteInfo(moveCount, height, width, startY, + startX, movePath, + chocolates); - outputResults(getChocolates); + // moveProcessメソッドでのエラー発生時に出力するtry-catch文 + try { + final List getChocolates = moveProcess(inputRouteInfo); + outputResults(getChocolates); + } catch (final IllegalArgumentException e) { + System.err + .println("エラー: " + + e.getMessage()); + } - sc.close(); } /** @@ -63,16 +69,20 @@ public class ValentineChocolate { * @param chocolates 各座席のチョコレートの数を格納した二次元配列 * @return 獲得したチョコレートの数を順番に格納したリスト */ - private static List moveProcess(final InputData inputData) { + private static List moveProcess(final InputRouteInfo inputRouteInfo) { final List getChocolates = new ArrayList<>(); - int currentY = inputData.getStartY(); - int currentX = inputData.getStartX(); + int currentY = inputRouteInfo.getStartY(); + int currentX = inputRouteInfo.getStartX(); + + final int height = inputRouteInfo.getHeight(); + final int width = inputRouteInfo.getWidth(); // 移動経路に従ってチョコレートを獲得 - for (int i = 0; i < inputData.getMoveCount(); i++) { - final char move = inputData.getMovePath().charAt(i); + for (int i = 0; i < inputRouteInfo.getMoveCount(); i++) { + final char move = inputRouteInfo.getMovePath().charAt(i); + switch (move) { case 'F': // 前方向 currentY--; @@ -89,7 +99,18 @@ public class ValentineChocolate { default: break; } - getChocolates.add(inputData.getChocolate(currentY, currentX)); + + // 境界値チェック + if (currentY < 0 || currentY >= height || currentX < 0 || currentX >= width) { + throw new IllegalArgumentException("座席の移動が範囲を超えました。現在の座標: (" + + currentY + + ", " + + currentX + + "), 移動方向: " + + move); + } + + getChocolates.add(inputRouteInfo.getChocolate(currentY, currentX)); } return getChocolates; } @@ -108,17 +129,17 @@ public class ValentineChocolate { /** * . 入力データを保持するためのヘルパークラス */ - private static class InputData { - private final int moveCount; - private final int height; - private final int width; - private final int startY; - private final int startX; - private final String movePath; - private final int[][] chocolates; - + private static class InputRouteInfo { + private final int moveCount; + private final int height; + private final int width; + private final int startY; + private final int startX; + private final String movePath; + private final int[][] chocolates; + /** - * . InputDataの新しいインスタンスを生成し、全てのフィールドを初期化するコンストラクタ + * . InputRouteInfoの新しいインスタンスを生成し、全てのフィールドを初期化するコンストラクタ * * @param moveCount 移動回数 * @param height クラスの縦の席数 @@ -128,10 +149,10 @@ public class ValentineChocolate { * @param movePath 移動経路を表す文字列 * @param chocolates 各座席のチョコレートの数を格納した二次元配列 */ - public InputData(final int moveCount, final int height, final int width, + public InputRouteInfo(final int moveCount, final int height, final int width, final int startY, final int startX, final String movePath, final int[][] chocolates) { - + this.moveCount = moveCount; this.height = height; this.width = width; @@ -147,7 +168,7 @@ public class ValentineChocolate { * @return 移動回数 */ public int getMoveCount() { - + return moveCount; } @@ -157,7 +178,7 @@ public class ValentineChocolate { * @return クラスの縦の席数 */ public int getHeight() { - + return height; } @@ -167,7 +188,7 @@ public class ValentineChocolate { * @return クラスの横の席数 */ public int getWidth() { - + return width; } @@ -186,7 +207,7 @@ public class ValentineChocolate { * @return 自分の座席の開始列 */ public int getStartX() { - + return startX; } @@ -196,7 +217,7 @@ public class ValentineChocolate { * @return 移動経路を表す文字列 */ public String getMovePath() { - + return movePath; } @@ -208,7 +229,7 @@ public class ValentineChocolate { * @return その座標(座席)にあるチョコレートの数 */ public int getChocolate(final int y, final int x) { - + return chocolates[y][x]; } } -- GitLab From d0d715b7d164d6e3f4e5d3aeffb4be67d6d367b0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=AB=99=E9=8D=8B=20=E5=B0=9A=E8=BC=9D?= Date: Tue, 8 Jul 2025 13:33:38 +0900 Subject: [PATCH 3/3] =?UTF-8?q?paiza=E3=81=AE=E5=95=8F=E9=A1=8CB=5F136?= =?UTF-8?q?=E3=81=AE=E5=9B=9E=E7=AD=94=E3=82=92=E5=86=8D=E4=BF=AE=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ntakanabe/src/ValentineChocolate.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/ntakanabe/src/ValentineChocolate.java b/ntakanabe/src/ValentineChocolate.java index 17471d4..919c622 100644 --- a/ntakanabe/src/ValentineChocolate.java +++ b/ntakanabe/src/ValentineChocolate.java @@ -79,6 +79,8 @@ public class ValentineChocolate { final int height = inputRouteInfo.getHeight(); final int width = inputRouteInfo.getWidth(); + final int[][] seats = inputRouteInfo.getSeats(); + // 移動経路に従ってチョコレートを獲得 for (int i = 0; i < inputRouteInfo.getMoveCount(); i++) { final char move = inputRouteInfo.getMovePath().charAt(i); @@ -110,7 +112,7 @@ public class ValentineChocolate { + move); } - getChocolates.add(inputRouteInfo.getChocolate(currentY, currentX)); + getChocolates.add(seats[currentY][currentX]); } return getChocolates; } @@ -222,15 +224,13 @@ public class ValentineChocolate { } /** - * . 指定された座標のチョコレートの数を取得 + * . すべての座席のチョコレートの数を取得 * - * @param y 行インデックス - * @param x 列インデックス - * @return その座標(座席)にあるチョコレートの数 + * @return すべての座席のチョコレートの数を格納した二次元配列 */ - public int getChocolate(final int y, final int x) { + public int[][] getSeats() { - return chocolates[y][x]; + return chocolates; } } } -- GitLab