diff --git a/ykoiso/src/A023_Holiday.java b/ykoiso/src/A023_Holiday.java new file mode 100644 index 0000000000000000000000000000000000000000..04035cb0b482f8f3132c975ee55e37c5dd78dea7 --- /dev/null +++ b/ykoiso/src/A023_Holiday.java @@ -0,0 +1,56 @@ +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + +public class A023_Holiday { + public static final int TWO_HOLIDAY = 5; + + public static void main(String[] args) { + Scanner scan = new Scanner(System.in); + final int days = scan.nextInt(); + final List schedule = new ArrayList<>(); + for (int i = 0; i < days; i++) { + schedule.add(scan.nextInt()); + } + final int maxDaysOfTwoHoliDay = calcMaxTwoHoliday(days, schedule); + System.out.println(maxDaysOfTwoHoliDay); + scan.close(); + } + + // 週休2日の最大日数を計算 + public static int calcMaxTwoHoliday(final int days, final List schedule) { + // 週休2日の連続日数 + int daysOfTwoHoliDay = 0; + // 週休2日の最大連続日数 + int maxDaysOfTwoHoliDay = 0; + for (int i = 0; i < days - 6; i++) { + // 条件満たすなら加算 + if (isTwoHoliday(i, schedule)) { + daysOfTwoHoliDay++; + } else { + // 満たさない場合リセット + daysOfTwoHoliDay = 0; + } + maxDaysOfTwoHoliDay=Math.max(maxDaysOfTwoHoliDay, daysOfTwoHoliDay); + } + + // 0でないなら6日分加算 + if (maxDaysOfTwoHoliDay != 0) { + maxDaysOfTwoHoliDay += 6; + } + return maxDaysOfTwoHoliDay; + } + + // 週休2日の条件を満たすか + public static boolean isTwoHoliday(final int date, final List scehdule) { + int workCount = 0; + for (int i = date; i < date + 7; i++) { + workCount += scehdule.get(i); + } + if (workCount <= TWO_HOLIDAY) { + return true; + } else { + return false; + } + } +} diff --git a/ykoiso/test/A023_HolidayTest.java b/ykoiso/test/A023_HolidayTest.java new file mode 100644 index 0000000000000000000000000000000000000000..8f1b83123dfa232a1d4c5f70e44b9c76cb600005 --- /dev/null +++ b/ykoiso/test/A023_HolidayTest.java @@ -0,0 +1,39 @@ +import static org.junit.Assert.assertThat; +import java.util.Arrays; +import java.util.List; +import org.junit.Test; +import static org.hamcrest.CoreMatchers.*; + +public class A023_HolidayTest { + @Test + public void 週休2日の条件を判断できる() { + final List schedule = Arrays.asList(0, 1, 1, 0, 1, 1, 1); + int actual = A023_Holiday.calcMaxTwoHoliday(7, schedule); + int expected = 7; + assertThat(actual, is(expected)); + } + + @Test + public void 条件を満たさない時0を返す() { + final List schedule = Arrays.asList(1, 1, 1, 0, 1, 1, 1); + int actual = A023_Holiday.calcMaxTwoHoliday(7, schedule); + int expected = 0; + assertThat(actual, is(expected)); + } + + @Test + public void 連続した週休2日制の日数を計算できる() { + final List schedule = Arrays.asList(1, 1, 1, 0, 1, 1, 1, 0, 1, 0, 0, 1, 1, 1); + int actual = A023_Holiday.calcMaxTwoHoliday(14, schedule); + int expected = 13; + assertThat(actual, is(expected)); + } + @Test + public void 連続していない場合カウントされない() { + final List schedule = Arrays.asList(0, 1, 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0); + int actual = A023_Holiday.calcMaxTwoHoliday(14, schedule); + int expected = 7; + assertThat(actual, is(expected)); + } +} +