Last active
August 29, 2015 13:58
-
-
Save torazuka/10005367 to your computer and use it in GitHub Desktop.
第20回オフラインリアルタイムどう書くの解答
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
import static org.junit.Assert.assertEquals; | |
import java.util.ArrayList; | |
import java.util.Collections; | |
import java.util.HashMap; | |
import java.util.List; | |
import java.util.Map; | |
import org.junit.Test; | |
public class Meetime { | |
private static final char FREE = 'f'; | |
private static final char BUSY = 'b'; | |
public String solve(String input) { | |
Map<Character, String> schedule = parse(input); | |
List<Integer> meeting = new ArrayList<>(); | |
meeting = check(schedule.get('A'), schedule.get('B'), | |
schedule.get('I'), schedule.get('Z'), meeting); | |
meeting = check(schedule.get('A'), schedule.get('B'), | |
schedule.get('J'), schedule.get('Z'), meeting); | |
Collections.sort(meeting); | |
if (0 < meeting.size()) { | |
return convertToTime(meeting.get(0)) + "-" | |
+ convertToTime(meeting.get(0) + 60); | |
} | |
return "-"; | |
} | |
List<Integer> check(String as, String bs, String xs, String zs, | |
List<Integer> meeting) { | |
int beginIndex = 0; | |
int tmp = 0; | |
for (int i = 60 * 10; i < 60 * 18; i++) { | |
if (tmp == 0) { | |
beginIndex = i; | |
} | |
if (as.charAt(i) == FREE && bs.charAt(i) == FREE | |
&& xs.charAt(i) == FREE && zs.charAt(i) == BUSY) { | |
tmp++; | |
} else { | |
tmp = 0; | |
beginIndex = 0; | |
} | |
if (59 < tmp) { | |
meeting.add(beginIndex); | |
tmp = 0; | |
beginIndex = 0; | |
} | |
} | |
return meeting; | |
} | |
Map<Character, String> initSchedule() { | |
Map<Character, String> result = new HashMap<>(); | |
result.put('A', new String(new char[1440]).replace('\0', FREE)); | |
result.put('B', new String(new char[1440]).replace('\0', FREE)); | |
result.put('I', new String(new char[1440]).replace('\0', FREE)); | |
result.put('J', new String(new char[1440]).replace('\0', FREE)); | |
result.put('Z', new String(new char[1440]).replace('\0', FREE)); | |
return result; | |
} | |
Map<Character, String> parse(String input) { | |
Map<Character, String> result = initSchedule(); | |
String[] split = input.split(","); | |
for (String str : split) { | |
char name = str.charAt(0); | |
String schedule = result.get(name); | |
schedule = fill(schedule, convertToIndex(str.substring(1, 5)), | |
convertToIndex(str.substring(6, 10))); | |
result.put(name, schedule); | |
} | |
return result; | |
} | |
String fill(String schedule, int begin, int end) { | |
StringBuilder sb = new StringBuilder(schedule); | |
StringBuilder replaced = sb.replace(begin, end, new String(new char[end | |
- begin]).replace('\0', BUSY)); | |
return replaced.toString(); | |
} | |
String convertToTime(int index) { | |
int hour = index / 60; | |
int minute = index % 60; | |
return String.format("%02d", hour) + String.format("%02d", minute); | |
} | |
int convertToIndex(String time) { | |
int hour = Integer.parseInt(time.substring(0, 2)); | |
int minute = Integer.parseInt(time.substring(2, 4)); | |
return hour * 60 + minute; | |
} | |
void test(String input, String expected) { | |
Meetime meetime = new Meetime(); | |
String result = meetime.solve(input); | |
assertEquals(expected, result); | |
// System.out.println(expected.equals(result) ? "ok" + " : " + result | |
// : "****NG**** " + input + " : " + expected + " but " + result); | |
} | |
@Test | |
public void testFill() throws Exception { | |
Meetime meetime = new Meetime(); | |
assertEquals("fbbbf", meetime.fill("fffff", 1, 3)); | |
assertEquals("bbfff", meetime.fill("fffff", 0, 1)); | |
assertEquals("bbbbb", meetime.fill("fffff", 0, 4)); | |
} | |
@Test | |
public void testMeetime() throws Exception { | |
/* 0 */test( | |
"A1050-1130,B1400-1415,I1000-1400,I1600-1800,J1100-1745,Z1400-1421,Z1425-1800", | |
"1425-1525"); | |
/* 1 */test("A1000-1200,B1300-1800,Z1000-1215,Z1230-1800", "-"); | |
/* 2 */test("Z0800-2200", "1000-1100"); | |
/* 3 */test("A1000-1700,Z0800-2200", "1700-1800"); | |
/* 4 */test("A1000-1701,Z0800-2200", "-"); | |
/* 5 */test("A1000-1130,B1230-1800,Z0800-2200", "1130-1230"); | |
/* 6 */test("A1000-1129,B1230-1800,Z0800-2200", "1129-1229"); | |
/* 7 */test("A1000-1131,B1230-1800,Z0800-2200", "-"); | |
/* 8 */test("A1000-1130,B1229-1800,Z0800-2200", "-"); | |
/* 9 */test("A1000-1130,B1231-1800,Z0800-2200", "1130-1230"); | |
/* 10 */test("A1000-1130,B1230-1800,Z0800-1130,Z1131-2200", "-"); | |
/* 11 */test("A1000-1130,B1231-1800,Z0800-1130,Z1131-2200", "1131-1231"); | |
/* 12 */test("Z0800-0801", "-"); | |
/* 13 */test("Z0800-1031,Z1129-1220,Z1315-1400,Z1459-1600", "1459-1559"); | |
/* 14 */test("Z0800-2200,I1000-1600,J1030-1730", "1600-1700"); | |
/* 15 */test("Z0800-2200,I1000-1600,J1130-1730", "1000-1100"); | |
/* 16 */test("Z0800-2200,I1000-1600,J1130-1730,A0800-1025", "1025-1125"); | |
/* 17 */test("Z0800-2200,I1000-1600,J1130-1730,A0800-1645", "1645-1745"); | |
/* | |
* 18 | |
*/test("Z0800-2200,I1000-1600,J1130-1730,A0800-1645,I1735-2200", "-"); | |
/* | |
* 19 | |
*/test("Z0800-2200,I1000-1600,J1130-1730,A0800-1645,J1735-2200", | |
"1645-1745"); | |
/* 20 */test("Z1030-2200,I1000-1600,J1130-1730", "1030-1130"); | |
/* 21 */test("Z1035-1500,I1000-1600,J1130-1730,Z1644-2200", "1644-1744"); | |
/* 22 */test("I2344-2350,A2016-2253,Z1246-1952", "1246-1346"); | |
/* | |
* 23 | |
*/test("Z2155-2157,B1822-2032,Z1404-2000,Z2042-2147,Z2149-2154", | |
"1404-1504"); | |
/* 24 */test( | |
"Z2231-2250,Z2128-2219,B2219-2227,B2229-2230,Z0713-2121,A0825-1035,B1834-2001", | |
"1035-1135"); | |
/* 25 */test( | |
"J0807-1247,I0911-1414,B1004-1553,Z0626-1732,Z1830-1905,A1946-1954,A0623-1921", | |
"-"); | |
/* 26 */test( | |
"J1539-1733,J0633-1514,Z1831-1939,J1956-1959,I0817-1007,I1052-1524,Z1235-1756,Z0656-1144", | |
"1524-1624"); | |
/* 27 */test( | |
"Z2319-2350,B0833-2028,I2044-2222,A1410-2201,Z2044-2228,Z0830-2023,Z2242-2306,I2355-2359", | |
"-"); | |
/* 28 */test("B2001-2118,Z0712-1634,I1941-2102,B1436-1917", "1000-1100"); | |
/* 29 */test( | |
"A0755-1417,B2303-2335,Z0854-2150,Z2348-2356,Z2156-2340,I1024-1307,Z2357-2359", | |
"1417-1517"); | |
/* 30 */test( | |
"A1958-1959,B0822-1155,I1518-1622,Z1406-1947,A1800-1822,A0904-1422,J1730-1924,Z1954-1958,A1946-1956", | |
"1422-1522"); | |
/* 31 */test( | |
"B1610-1910,I2121-2139,A0619-1412,I2147-2153,Z0602-2111,I0841-2031,A1657-1905,A1956-2047,J0959-1032,Z2131-2147", | |
"1412-1512"); | |
/* 32 */test( | |
"Z0623-1900,A0703-1129,I1815-1910,J1956-1957,I0844-1518,Z1902-1935,B1312-1342,J1817-1955", | |
"1129-1229"); | |
/* 33 */test("J1246-1328,B1323-1449,I1039-1746,Z1218-2111", "1449-1549"); | |
/* 34 */test( | |
"A1958-1959,I1943-1944,I0731-1722,Z0845-1846,J1044-1513,Z1910-1923,B1216-1249", | |
"1513-1613"); | |
/* 35 */test( | |
"A1855-2047,Z0946-1849,Z2056-2059,I1855-1910,B1946-2058,I1956-2025,Z1905-2054,J0644-1800,I0720-1618", | |
"1618-1718"); | |
/* 36 */test( | |
"J1525-1950,Z0905-1933,A1648-1716,I2051-2054,I2015-2044,I0804-1958,B0934-1100,Z1953-2037", | |
"1100-1200"); | |
/* 37 */test( | |
"Z1914-1956,J0823-1610,Z0641-1841,J1800-1835,A0831-1346,I1926-1941,I1030-1558,I1738-1803", | |
"1558-1658"); | |
/* | |
* 38 | |
*/test("Z0625-1758,J1033-1351,B1816-2236,I0838-1615,J2247-2255", | |
"1351-1451"); | |
/* 39 */test("J0603-1233,A1059-1213,I1326-2103,Z0710-1459", "1213-1313"); | |
/* 40 */test( | |
"B1302-1351,J1410-2038,A0755-1342,J0637-0658,Z2148-2159,Z1050-2131,A1543-1844,I1615-1810", | |
"1351-1451"); | |
/* | |
* 41 | |
*/test("Z0746-2100,A2122-2156,I1022-1144,J0947-1441,A1333-1949", | |
"1144-1244"); | |
/* 42 */test( | |
"J0718-1243,Z1443-1818,B2055-2057,A0714-1238,Z1045-1344,A1643-1717,B1832-2039,J1623-1931", | |
"1238-1338"); | |
/* 43 */test( | |
"Z1921-1933,A1208-1418,I0827-1940,Z0757-1917,J0653-1554,B1859-1909", | |
"1554-1654"); | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment