diff --git a/knoda/src/A052_ClimbingStairs.java b/knoda/src/A052_ClimbingStairs.java new file mode 100644 index 0000000000000000000000000000000000000000..f4ca1ed47eba80e3247cb6177e13a1a03975b97c --- /dev/null +++ b/knoda/src/A052_ClimbingStairs.java @@ -0,0 +1,45 @@ +package hellojunit; + +import java.util.HashSet; +import java.util.Scanner; +import java.util.Set; + +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段飛ばし + scan.close(); + ClimbingStairs climbingStairs = new ClimbingStairs(); + // 未到達の段数を取得する + System.out.println(climbingStairs.getNotStepStairs(stairsNum, skipStepNumA, skipStepNumB)); + } + +} + +class ClimbingStairs { + + /** + * 未到達の段数を取得するメソッド + * @param stairsNum : 階段の段数 + * @param skipStepNumA : A段飛ばし + * @param skipStepNumB : B段飛ばし + * @return stairsNum - ableSteps : 未到達の段数 + */ + public int getNotStepStairs(final int stairsNum, final int skipStepNumA, final int skipStepNumB) { + 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); + } + } + + return stairsNum - ableSteps; + } +} diff --git a/knoda/test/A052_ClimbingStairsTest.java b/knoda/test/A052_ClimbingStairsTest.java new file mode 100644 index 0000000000000000000000000000000000000000..3c198747f1f5faed8b847f94032a2420739c7890 --- /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)); + } + +}