diff --git a/knoda/src/B085_TreasureHunt.java b/knoda/src/B085_TreasureHunt.java new file mode 100644 index 0000000000000000000000000000000000000000..48863ceca815dd670de3e3f258872b7d00df0283 --- /dev/null +++ b/knoda/src/B085_TreasureHunt.java @@ -0,0 +1,140 @@ +package hellojunit; + +import java.util.Scanner; + +public class B085_TreasureHunt { + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + // 宝が存在している位置を入力する + final int treasurePosition = scan.nextInt(); + + TreasureHunt treasureHunt = new TreasureHunt(treasurePosition); + // 1つ目の方法(getTravelDistance1)と2つ目の方法(getTravelDistance2)でそれぞれ移動距離を取得する + final int travelDistance1 = treasureHunt.getTravelDistance1(); + final int travelDistance2 = treasureHunt.getTravelDistance2(); + System.out.println(travelDistance1 + " " + travelDistance2); + scan.close(); + } + +} + +// 移動距離を取得するクラス +class TreasureHunt { + private static final int START_POSITION_INIT = 0; // 原点(スタート位置) + private static final int FINISH_POSITION_INIT = 1; // 最初に移動するとき、移動終了の位置 + private static final int TRAVEL_DISTANCE_INIT = 0; // 移動距離の初期化 + private final int treasurePosition; // 宝が存在している座標 + private boolean isTreasure; // 宝が見つかったかの判定(true : 見つかった、false : 見つかっていない) + // private int startPosition; // startPosition : 移動開始の位置 + // private int finishPosition; // finishPosition : 移動終了の位置 + // private int travelDistance; // travelDistance : 移動距離 + + public TreasureHunt(final int treasurePosition) { + this.treasurePosition = treasurePosition; + } + + /* + // 移動開始位置、移動終了位置、移動距離の初期化 + private void init(final int startPosition, final int finishPosition, + final int travelDistance, final boolean isTreasure) { + this.startPosition = startPosition; + this.finishPosition = finishPosition; + this.travelDistance = travelDistance; + this.isTreasure = isTreasure; + } + */ + + // 1つ目の方法で移動距離を取得するメソッド + public int getTravelDistance1() { + // 移動開始位置、移動終了位置、移動距離の初期化 + // init(START_POSITION_INIT, FINISH_POSITION_INIT, TRAVEL_DISTANCE_INIT, false); + + isTreasure = false; // 宝が見つかったかの判定(true : 見つかった、false : 見つかっていない) + int startPosition = START_POSITION_INIT; // startPosition : 移動開始の位置 + int finishPosition = FINISH_POSITION_INIT; // finishPosition : 移動終了の位置 + int travelDistance = TRAVEL_DISTANCE_INIT; // travelDistance : 移動距離 + while (true) { + + // 移動距離を取得する + travelDistance = calcTravelDistance(startPosition, finishPosition, travelDistance); + + // startPosition、FinishPositionを更新する + if (startPosition < finishPosition) { + int tmpPosition = startPosition; + startPosition = finishPosition; + finishPosition = startPosition - (finishPosition - tmpPosition) - 1; + } else { + int tmpPosition = startPosition; + startPosition = finishPosition; + finishPosition = startPosition + (tmpPosition - finishPosition) + 1; + } + + // 宝が見つかったとき + if (isTreasure) { + break; + } + + } + return travelDistance; + } + + // 2つ目の方法で移動距離を取得するメソッド + public int getTravelDistance2() { + // init(START_POSITION_INIT, FINISH_POSITION_INIT, TRAVEL_DISTANCE_INIT, false); + + isTreasure = false; // 宝が見つかったかの判定(true : 見つかった、false : 見つかっていない) + int startPosition = START_POSITION_INIT; // startPosition : 移動開始の位置 + int finishPosition = FINISH_POSITION_INIT; // finishPosition : 移動終了の位置 + int travelDistance = TRAVEL_DISTANCE_INIT; // travelDistance : 移動距離 + while (true) { + + // 移動距離を取得する + travelDistance = calcTravelDistance(startPosition, finishPosition, travelDistance); + + // startPosition、FinishPositionを更新する + if (startPosition < finishPosition) { + final int tmpPosition = startPosition; + startPosition = finishPosition; + if (finishPosition == FINISH_POSITION_INIT) { + finishPosition = startPosition - (finishPosition - tmpPosition) - 1; + } else { + finishPosition = startPosition - (finishPosition - tmpPosition) - finishPosition / 2; + } + } else { + final int tmpPosition = startPosition; + startPosition = finishPosition; + finishPosition = startPosition + (tmpPosition - finishPosition) - finishPosition; + } + + // 宝が見つかったとき + if (isTreasure) { + break; + } + } + return travelDistance; + } + + // 移動距離を算出するメソッド + private int calcTravelDistance(final int startPosition, final int finishPosition, int travelDistance) { + int position = startPosition; + + // 宝が見つかる、もしくは移動終了位置まで到達するまで移動距離をカウントアップする + while ((position != treasurePosition) && (position != finishPosition)) { + travelDistance++; + if (startPosition < finishPosition) { + position++; + } else { + position--; + } + } + + // 宝が見つかったとき + if (position == treasurePosition) { + isTreasure = true; + } + return travelDistance; + } + + +} diff --git a/knoda/test/B085_TreasureHuntTest.java b/knoda/test/B085_TreasureHuntTest.java new file mode 100644 index 0000000000000000000000000000000000000000..33922bda7d7fb56854d9d8864a0d7dac2e0d8c5d --- /dev/null +++ b/knoda/test/B085_TreasureHuntTest.java @@ -0,0 +1,50 @@ +package hellojunit; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import org.junit.Test; + +public class B085_TreasureHuntTest { + + int treasurePosition; + TreasureHunt sut; + @Test + public void 宝の座標がマイナス3のとき21_23が出力されるテスト() { + treasurePosition = -3; + sut = new TreasureHunt(treasurePosition); + int expected1 = 21; + int expected2 = 23; + int actual1 = sut.getTravelDistance1(); + int actual2 = sut.getTravelDistance2(); + assertThat(actual1, is(expected1)); + assertThat(actual2, is(expected2)); + } + + @Test + public void 宝の座標が5のとき45_33が出力されるテスト() { + treasurePosition = 5; + sut = new TreasureHunt(treasurePosition); + int expected1 = 45; + int expected2 = 33; + int actual1 = sut.getTravelDistance1(); + int actual2 = sut.getTravelDistance2(); + assertThat(actual1, is(expected1)); + assertThat(actual2, is(expected2)); + } + + @Test + public void 宝の座標が0のとき0_0が出力されるテスト() { + treasurePosition = 0; + sut = new TreasureHunt(treasurePosition); + int expected1 = 0; + int expected2 = 0; + int actual1 = sut.getTravelDistance1(); + int actual2 = sut.getTravelDistance2(); + assertThat(actual1, is(expected1)); + assertThat(actual2, is(expected2)); + } + + + +}