From d20d78a5adf64478077bee8cf58c37c3978c569a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E7=94=B0=20=E5=95=93=E4=BB=8B?= Date: Wed, 24 Aug 2022 14:47:51 +0900 Subject: [PATCH 1/3] =?UTF-8?q?A052=20=E9=9A=8E=E6=AE=B5=E7=99=BB=E3=82=8A?= =?UTF-8?q?ver1.0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knoda/src/A052_ClimbingStairs.java | 68 ++++++++++++++++++++++ knoda/test/A052_ClimbingStairsTest.java | 76 +++++++++++++++++++++++++ 2 files changed, 144 insertions(+) create mode 100644 knoda/src/A052_ClimbingStairs.java create mode 100644 knoda/test/A052_ClimbingStairsTest.java diff --git a/knoda/src/A052_ClimbingStairs.java b/knoda/src/A052_ClimbingStairs.java new file mode 100644 index 0000000..a59fe90 --- /dev/null +++ b/knoda/src/A052_ClimbingStairs.java @@ -0,0 +1,68 @@ +package hellojunit; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class A052_ClimbingStairs { + + public static void main(String[] args) { + final Scanner scan = new Scanner(System.in); + final int stairsNum = scan.nextInt(); // 階段の数 + final int skipStepNumA = scan.nextInt(); // A段飛ばし + final int skipStepNumB = scan.nextInt(); // B段飛ばし + ClimbingStairs climbingStairs = new ClimbingStairs(); + // 未到達の段数を取得する + System.out.println(climbingStairs.getNotStepStairs(stairsNum, skipStepNumA, skipStepNumB)); + scan.close(); + } + +} + +class ClimbingStairs { + private final int MAX_SKIP_COUNT = 200000; // 階段を登るために必要な最大ステップ数 + // それぞれの階段の状態(到達しているかどうか)を格納するリスト(true : 到達, false : 未到達) + private List stepStairsStatus = new ArrayList(); + + /** + * 未到達の段数を取得するメソッド + * @param stairsNum : 階段の段数 + * @param skipStepNumA : A段飛ばし + * @param skipStepNumB : B段飛ばし + * @return notStepStairs : 未到達の段数 + */ + public int getNotStepStairs(final int stairsNum, final int skipStepNumA, final int skipStepNumB) { + // それぞれの階段の状態(到達しているかどうか)を未到達(false)として初期化する + init(stairsNum); + + // どの階段に到達したかを算出する + for (int skipStepNumACount = 0; skipStepNumACount <= MAX_SKIP_COUNT; skipStepNumACount++) { + for (int skipStepNumBCount = 0; skipStepNumBCount <= MAX_SKIP_COUNT; skipStepNumBCount++) { + final int stairs = skipStepNumA * skipStepNumACount + skipStepNumB * skipStepNumBCount; + if (stairs >= stepStairsStatus.size()) { + // 階段の段数を超えている場合 + break; + } + // 階段の状態をtrueに更新する + stepStairsStatus.set(stairs, true); + } + } + if (stepStairsStatus.get(stairsNum) == false) { + // 頂上が未到達のとき + stepStairsStatus.set(stairsNum, true); + } + + final int notStepStairs = (int) stepStairsStatus.stream().filter(i -> i == false).count(); + return notStepStairs; + } + + /** + * それぞれの階段の状態を未到達として初期化するメソッド + * @param stairsNum : 階段の段数 + */ + private void init(final int stairsNum) { + for (int i = 0; i < stairsNum + 1; i++) { + stepStairsStatus.add(false); + } + } +} diff --git a/knoda/test/A052_ClimbingStairsTest.java b/knoda/test/A052_ClimbingStairsTest.java new file mode 100644 index 0000000..3c19874 --- /dev/null +++ b/knoda/test/A052_ClimbingStairsTest.java @@ -0,0 +1,76 @@ +package hellojunit; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import org.junit.Test; + +public class A052_ClimbingStairsTest { + + @Test + public void 階段の段数が1段のときのテスト() { + final int stairsNum = 1; + final int skipStepNumA = 3; + final int skipStepNumB = 4; + ClimbingStairs climbingStairs = new ClimbingStairs(); + final int actual = climbingStairs.getNotStepStairs(stairsNum, skipStepNumA, skipStepNumB); + final int expected = 0; + assertThat(actual, is(expected)); + } + + @Test + public void 階段の段数が200000段のときのテスト() { + final int stairsNum = 200000; + final int skipStepNumA = 90; + final int skipStepNumB = 100; + ClimbingStairs climbingStairs = new ClimbingStairs(); + final int actual = climbingStairs.getNotStepStairs(stairsNum, skipStepNumA, skipStepNumB); + final int expected = 180036; + assertThat(actual, is(expected)); + } + + @Test + public void 基本テスト1() { + final int stairsNum = 8; + final int skipStepNumA = 3; + final int skipStepNumB = 5; + ClimbingStairs climbingStairs = new ClimbingStairs(); + final int actual = climbingStairs.getNotStepStairs(stairsNum, skipStepNumA, skipStepNumB); + final int expected = 4; + assertThat(actual, is(expected)); + } + + @Test + public void 基本テスト2() { + final int stairsNum = 10; + final int skipStepNumA = 2; + final int skipStepNumB = 4; + ClimbingStairs climbingStairs = new ClimbingStairs(); + final int actual = climbingStairs.getNotStepStairs(stairsNum, skipStepNumA, skipStepNumB); + final int expected = 5; + assertThat(actual, is(expected)); + } + + @Test + public void 基本テスト3() { + final int stairsNum = 15; + final int skipStepNumA = 4; + final int skipStepNumB = 6; + ClimbingStairs climbingStairs = new ClimbingStairs(); + final int actual = climbingStairs.getNotStepStairs(stairsNum, skipStepNumA, skipStepNumB); + final int expected = 8; + assertThat(actual, is(expected)); + } + + @Test + public void 基本テスト4() { + final int stairsNum = 7; + final int skipStepNumA = 3; + final int skipStepNumB = 5; + ClimbingStairs climbingStairs = new ClimbingStairs(); + final int actual = climbingStairs.getNotStepStairs(stairsNum, skipStepNumA, skipStepNumB); + final int expected = 3; + assertThat(actual, is(expected)); + } + +} -- GitLab From 7d5389e0456f9e925f4b7a69b49b0ba8d8955783 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E7=94=B0=20=E5=95=93=E4=BB=8B?= Date: Thu, 25 Aug 2022 08:30:25 +0900 Subject: [PATCH 2/3] =?UTF-8?q?A052=20=E9=9A=8E=E6=AE=B5=E7=99=BB=E3=82=8A?= =?UTF-8?q?ver1.1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knoda/src/A052_ClimbingStairs.java | 51 ++++++++++++++---------------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/knoda/src/A052_ClimbingStairs.java b/knoda/src/A052_ClimbingStairs.java index a59fe90..e1e8b37 100644 --- a/knoda/src/A052_ClimbingStairs.java +++ b/knoda/src/A052_ClimbingStairs.java @@ -1,8 +1,8 @@ package hellojunit; -import java.util.ArrayList; -import java.util.List; import java.util.Scanner; +import java.util.Set; +import java.util.TreeSet; public class A052_ClimbingStairs { @@ -11,18 +11,17 @@ public class A052_ClimbingStairs { final int stairsNum = scan.nextInt(); // 階段の数 final int skipStepNumA = scan.nextInt(); // A段飛ばし final int skipStepNumB = scan.nextInt(); // B段飛ばし + scan.close(); ClimbingStairs climbingStairs = new ClimbingStairs(); // 未到達の段数を取得する System.out.println(climbingStairs.getNotStepStairs(stairsNum, skipStepNumA, skipStepNumB)); - scan.close(); } } class ClimbingStairs { - private final int MAX_SKIP_COUNT = 200000; // 階段を登るために必要な最大ステップ数 - // それぞれの階段の状態(到達しているかどうか)を格納するリスト(true : 到達, false : 未到達) - private List stepStairsStatus = new ArrayList(); + // 到達した階段番号を格納するセット + private Set stepStairsStatus = new TreeSet(); /** * 未到達の段数を取得するメソッド @@ -32,37 +31,33 @@ class ClimbingStairs { * @return notStepStairs : 未到達の段数 */ public int getNotStepStairs(final int stairsNum, final int skipStepNumA, final int skipStepNumB) { - // それぞれの階段の状態(到達しているかどうか)を未到達(false)として初期化する - init(stairsNum); - // どの階段に到達したかを算出する - for (int skipStepNumACount = 0; skipStepNumACount <= MAX_SKIP_COUNT; skipStepNumACount++) { - for (int skipStepNumBCount = 0; skipStepNumBCount <= MAX_SKIP_COUNT; skipStepNumBCount++) { + for (int skipStepNumACount = 0; skipStepNumACount <= stairsNum; skipStepNumACount++) { + + final int skipStepNumAStairs = skipStepNumA * skipStepNumACount; + if (stairsNum < skipStepNumAStairs) { + // 階段の段数を超えている場合 + stepStairsStatus.add(stairsNum); + break; + } + + for (int skipStepNumBCount = 0; skipStepNumBCount <= stairsNum; skipStepNumBCount++) { final int stairs = skipStepNumA * skipStepNumACount + skipStepNumB * skipStepNumBCount; - if (stairs >= stepStairsStatus.size()) { + if (stairs == 0) { + continue; + } + + if (stairsNum < stairs) { // 階段の段数を超えている場合 + stepStairsStatus.add(stairsNum); break; } // 階段の状態をtrueに更新する - stepStairsStatus.set(stairs, true); + stepStairsStatus.add(stairs); } } - if (stepStairsStatus.get(stairsNum) == false) { - // 頂上が未到達のとき - stepStairsStatus.set(stairsNum, true); - } - final int notStepStairs = (int) stepStairsStatus.stream().filter(i -> i == false).count(); + final int notStepStairs = stairsNum - stepStairsStatus.size(); return notStepStairs; } - - /** - * それぞれの階段の状態を未到達として初期化するメソッド - * @param stairsNum : 階段の段数 - */ - private void init(final int stairsNum) { - for (int i = 0; i < stairsNum + 1; i++) { - stepStairsStatus.add(false); - } - } } -- GitLab From d21a49dae9700ccb07ad48f48753fc15fb8ea6b9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=87=8E=E7=94=B0=20=E5=95=93=E4=BB=8B?= Date: Thu, 25 Aug 2022 12:02:52 +0900 Subject: [PATCH 3/3] =?UTF-8?q?A052=20=E9=9A=8E=E6=AE=B5=E7=99=BB=E3=82=8A?= =?UTF-8?q?ver1.2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- knoda/src/A052_ClimbingStairs.java | 40 ++++++++---------------------- 1 file changed, 11 insertions(+), 29 deletions(-) diff --git a/knoda/src/A052_ClimbingStairs.java b/knoda/src/A052_ClimbingStairs.java index e1e8b37..f4ca1ed 100644 --- a/knoda/src/A052_ClimbingStairs.java +++ b/knoda/src/A052_ClimbingStairs.java @@ -1,8 +1,8 @@ package hellojunit; +import java.util.HashSet; import java.util.Scanner; import java.util.Set; -import java.util.TreeSet; public class A052_ClimbingStairs { @@ -20,44 +20,26 @@ public class A052_ClimbingStairs { } class ClimbingStairs { - // 到達した階段番号を格納するセット - private Set stepStairsStatus = new TreeSet(); /** * 未到達の段数を取得するメソッド * @param stairsNum : 階段の段数 * @param skipStepNumA : A段飛ばし * @param skipStepNumB : B段飛ばし - * @return notStepStairs : 未到達の段数 + * @return stairsNum - ableSteps : 未到達の段数 */ public int getNotStepStairs(final int stairsNum, final int skipStepNumA, final int skipStepNumB) { - // どの階段に到達したかを算出する - for (int skipStepNumACount = 0; skipStepNumACount <= stairsNum; skipStepNumACount++) { - - final int skipStepNumAStairs = skipStepNumA * skipStepNumACount; - if (stairsNum < skipStepNumAStairs) { - // 階段の段数を超えている場合 - stepStairsStatus.add(stairsNum); - break; - } - - for (int skipStepNumBCount = 0; skipStepNumBCount <= stairsNum; skipStepNumBCount++) { - final int stairs = skipStepNumA * skipStepNumACount + skipStepNumB * skipStepNumBCount; - if (stairs == 0) { - continue; - } - - if (stairsNum < stairs) { - // 階段の段数を超えている場合 - stepStairsStatus.add(stairsNum); - break; - } - // 階段の状態をtrueに更新する - stepStairsStatus.add(stairs); + Set steps = new HashSet(stairsNum); + steps.add(0); + int ableSteps = 0; + for (int i = 0; i < stairsNum; i++) { + if (steps.contains(i)) { + ableSteps++; + steps.add(i + skipStepNumA); + steps.add(i + skipStepNumB); } } - final int notStepStairs = stairsNum - stepStairsStatus.size(); - return notStepStairs; + return stairsNum - ableSteps; } } -- GitLab