diff --git a/knoda/src/B067_TaskProcess.java b/knoda/src/B067_TaskProcess.java new file mode 100644 index 0000000000000000000000000000000000000000..69d888511661c515cda1ae19d5a75cfc2ade841d --- /dev/null +++ b/knoda/src/B067_TaskProcess.java @@ -0,0 +1,125 @@ +package hellojunit; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class B067_TaskProcess { + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + final int taskNum = scan.nextInt(); // taskNum : タスクの数 + final List> taskList = new ArrayList>(); + for (int task = 0; task < taskNum; task++) { + final List scheduleList = new ArrayList(); + scheduleList.add(scan.nextInt()); // 必要日数 + scheduleList.add(scan.nextInt()); // 開始日 + scheduleList.add(scan.nextInt()); // 終了日 + taskList.add(scheduleList); + } + TaskProcess taskProcess = new TaskProcess(taskList); + + if (taskProcess.isCanFinishTask()) { + // すべてのタスクを終了することができたときはyesを出力する + System.out.println("YES"); + } else { + // そうでないときはNoを出力する + System.out.println("NO"); + } + scan.close(); + } + +} + +class TaskProcess { + // taskList : それぞれのタスクの必要日数、開始日、終了日が格納されているリスト + private final List> taskList; + // taskLapsedList : それぞれのタスクの経過時間を格納したリスト + private List taskLapsedList = new ArrayList(); + private final int TIME_DAY_INDEX = 0; // taskListに存在している、必要日数の要素番号 + private final int START_DAY_INDEX = 1; // taskListに存在している、開始日の要素番号 + private final int FINISH_DAY_INDEX = 2; // taskListに存在している、終了日の要素番号 + + public TaskProcess(final List> taskList) { + this.taskList = taskList; + } + + // すべてのタスクを終了することができるか判定する + public boolean isCanFinishTask() { + // wholeTaskStartDay : すべてのタスクの中で最も早い開始日 + int wholeTaskStartDay = taskList.get(0).get(START_DAY_INDEX); + for (int task = 1; task < taskList.size(); task++) { + if (wholeTaskStartDay > taskList.get(task).get(START_DAY_INDEX)) { + wholeTaskStartDay = taskList.get(task).get(START_DAY_INDEX); + } + } + + // wholeTaskStartDay : すべてのタスクの中で最も遅い終了日 + int wholeTaskFinishDay = taskList.get(0).get(FINISH_DAY_INDEX); + for (int task = 1; task < taskList.size(); task++) { + if (wholeTaskFinishDay < taskList.get(task).get(FINISH_DAY_INDEX)) { + wholeTaskFinishDay = taskList.get(task).get(FINISH_DAY_INDEX); + } + } + + setUp(); + // すべてのタスクの開始日から終了日までのタスクの経過状況を調べる + for (int day = wholeTaskStartDay; day <= wholeTaskFinishDay; day++) { + + // primaryTask : 実行するタスクを取得する + final int primaryTask = getPrimaryTask(day); + if (primaryTask == -1) { + // タスクが実行できないとき + // ある時刻でタスクが1つも行われていないとき + if (taskLapsedList.stream().filter(time -> time == 0).count() > 0) { + continue; + } + return false; + } + // タスクの経過時間を更新する + taskLapsedList.set(primaryTask, taskLapsedList.get(primaryTask) + 1); + + // isFinishTask : タスクが終了したかの判定 + boolean isFinishTask = true; + for (int task = 0; task < taskList.size(); task++) { + if (taskList.get(task).get(TIME_DAY_INDEX) != taskLapsedList.get(task)) { + isFinishTask = false; + break; + } + } + + if (isFinishTask) { + break; + } + } + + // すべてのタスクの終了日を迎えた時点で、すべてのタスクを終了できるか判定する + for (int task = 0; task < taskList.size(); task++) { + if (taskList.get(task).get(TIME_DAY_INDEX) != taskLapsedList.get(task)) { + return false; + } + } + return true; + } + + // どのタスクを実行するかを取得する + private int getPrimaryTask(final int day) { + int primaryTask = -1; + for (int task = 0; task < taskList.size(); task++) { + if ((taskList.get(task).get(START_DAY_INDEX) <= day) && (day <= taskList.get(task).get(FINISH_DAY_INDEX)) + && (taskLapsedList.get(task) < taskList.get(task).get(TIME_DAY_INDEX))) { + primaryTask = task; + break; + } + } + return primaryTask; + } + + // それぞれのタスクの実行時間を0として初期化する + private void setUp() { + for (int task = 0; task < taskList.size(); task++) { + taskLapsedList.add(0); + } + } + +} diff --git a/knoda/test/B067_TaskProcessTest.java b/knoda/test/B067_TaskProcessTest.java new file mode 100644 index 0000000000000000000000000000000000000000..0caa46325e8dbed53a82a6a2fbb3445096571119 --- /dev/null +++ b/knoda/test/B067_TaskProcessTest.java @@ -0,0 +1,118 @@ +package hellojunit; + +import static org.hamcrest.CoreMatchers.*; +import static org.junit.Assert.*; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.junit.Test; + +public class B067_TaskProcessTest { + List> taskList; + List scheduleList; + TaskProcess sut; + + @Test + public void YESと出力されるテスト() { + taskList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList(4, 8, 11)), + new ArrayList(Arrays.asList(7, 4, 15)), + new ArrayList(Arrays.asList(7, 1, 20)) + )); + + sut = new TaskProcess(taskList); + String expected = "YES"; + String actual; + boolean isCanFinishTask = sut.isCanFinishTask(); + + if (isCanFinishTask) { + actual = "YES"; + } else { + actual = "NO"; + } + assertThat(actual, is(expected)); + } + + @Test + public void NOと出力されるテスト() { + taskList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList(8, 1, 15)), + new ArrayList(Arrays.asList(4, 8, 11)) + )); + + sut = new TaskProcess(taskList); + String expected = "NO"; + String actual; + boolean isCanFinishTask = sut.isCanFinishTask(); + + if (isCanFinishTask) { + actual = "YES"; + } else { + actual = "NO"; + } + assertThat(actual, is(expected)); + } + + @Test + public void YESと出力される境界値テスト() { + taskList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList(2, 3, 4)), + new ArrayList(Arrays.asList(4, 2, 7)) + )); + + sut = new TaskProcess(taskList); + String expected = "YES"; + String actual; + boolean isCanFinishTask = sut.isCanFinishTask(); + + if (isCanFinishTask) { + actual = "YES"; + } else { + actual = "NO"; + } + assertThat(actual, is(expected)); + } + + @Test + public void 境界値テストでNOと出力されるテスト() { + taskList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList(2, 3, 4)), + new ArrayList(Arrays.asList(4, 2, 6)) + )); + + sut = new TaskProcess(taskList); + String expected = "NO"; + String actual; + boolean isCanFinishTask = sut.isCanFinishTask(); + + if (isCanFinishTask) { + actual = "YES"; + } else { + actual = "NO"; + } + assertThat(actual, is(expected)); + } + + @Test + public void ある時刻のときにどのタスクも実行されないテストでYESが出力される() { + taskList = new ArrayList>(Arrays.asList( + new ArrayList(Arrays.asList(2, 1, 3)), + new ArrayList(Arrays.asList(3, 5, 9)) + )); + + sut = new TaskProcess(taskList); + String expected = "YES"; + String actual; + boolean isCanFinishTask = sut.isCanFinishTask(); + + if (isCanFinishTask) { + actual = "YES"; + } else { + actual = "NO"; + } + assertThat(actual, is(expected)); + } + +}