Advertisement
Guest User

Untitled

a guest
Oct 22nd, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.80 KB | None | 0 0
  1. /*
  2. * To change this license header, choose License Headers in Project Properties.
  3. * To change this template file, choose Tools | Templates
  4. * and open the template in the editor.
  5. */
  6. package javaapplication1;
  7.  
  8. import java.util.ArrayList;
  9. import java.util.Collections;
  10. import java.util.HashMap;
  11. import java.util.HashSet;
  12. import java.util.List;
  13. import java.util.Map;
  14. import java.util.Set;
  15.  
  16. /**
  17. *
  18. * @author Jason Wang
  19. */
  20. public class Sick {
  21. public static void main(String[] args){
  22. }
  23.  
  24.  
  25. public String[] allHealthy(String[] everyone){
  26. Map<String, List<String>> personItenariesMap = new HashMap<>();
  27. Map<String, List<String>> personHealthStateMap = new HashMap<>();
  28. Map<String, Set<String>> locationToPeopleMap = new HashMap<>();
  29. for (String person : everyone){
  30. String[] personWithLocations = person.split(" ");
  31. String name = personWithLocations[0];
  32. String personState = personWithLocations[1];
  33. List<String> stateList = new ArrayList<>();
  34. List<String> locationList = new ArrayList<>();
  35. for (int i = 2; i < personWithLocations.length ; i ++){
  36. if (i == 2){
  37. updateLocation(name, "", personWithLocations[i], locationToPeopleMap);
  38. }
  39. locationList.add(personWithLocations[i]);
  40. }
  41. stateList.add(personState);
  42. personItenariesMap.put(name, locationList);
  43. personHealthStateMap.put(name, stateList);
  44. }
  45. int day = 1;
  46. boolean everyHealthy = false;
  47. while (day <= 365 && everyHealthy){
  48. everyHealthy = true;
  49. for (String person : personItenariesMap.keySet()){
  50. int personLocationIndex = -1;
  51. if (day <= personItenariesMap.get(person).size()){
  52. personLocationIndex = day;
  53. } else {
  54. personLocationIndex = day % personItenariesMap.get(person).size() - 1;
  55. }
  56. String personLocation = personItenariesMap.get(person).get(personLocationIndex);
  57. boolean hasSickPpl = arePplSickAtLocation(personLocation, locationToPeopleMap, personHealthStateMap);
  58. String nextDayState = nextDayState(personHealthStateMap.get(person).get(personHealthStateMap.get(person).size()-1), hasSickPpl);
  59. if (!nextDayState.equals("HEALTHY")){
  60. everyHealthy = false;
  61. }
  62. personHealthStateMap.get(person).add(nextDayState);
  63. }
  64. for (String person : personItenariesMap.keySet()){
  65. int personPreviousLocationIndex = -1;
  66. if (day <= personItenariesMap.get(person).size()){
  67. personPreviousLocationIndex = day;
  68. } else {
  69. personPreviousLocationIndex = day % personItenariesMap.get(person).size() - 1;
  70. }
  71.  
  72. int personNextLocationIndex = -1;
  73. if (day +1 <= personItenariesMap.get(person).size()){
  74. personNextLocationIndex = day + 1;
  75. } else {
  76. personNextLocationIndex = (day + 1) % personItenariesMap.get(person).size() - 1;
  77. }
  78.  
  79. String personPrevLocation = personItenariesMap.get(person).get(personPreviousLocationIndex);
  80. String personNextLocation = personItenariesMap.get(person).get(personPreviousLocationIndex);
  81. // in the end, update location
  82. updateLocation(person, personPrevLocation, personNextLocation, locationToPeopleMap);
  83. }
  84. day++;
  85. }
  86. String[] days = new String[day + 2];
  87. List<String> persons = new ArrayList<>();
  88. StringBuilder sb = new StringBuilder();
  89. for (String person : personHealthStateMap.keySet()){
  90. persons.add(person);
  91. sb.append(person);
  92. sb.append(" ");
  93. }
  94.  
  95. days[0] = sb.toString().trim();
  96. for (int i = 0; i < day ; i ++){
  97. StringBuilder sb2 = new StringBuilder();
  98. for (String p : persons){
  99. sb2.append(personHealthStateMap.get(p).get(i));
  100. sb2.append(" ");
  101. }
  102. days[i + 1] = sb2.toString().trim();
  103. }
  104. days[days.length - 1] = day + "";
  105. return days;
  106. }
  107.  
  108. public boolean arePplSickAtLocation(String location, Map<String, Set<String>> pplAtLocation, Map<String, List<String>> personHealthStateMap ){
  109. Set<String> people = pplAtLocation.get(location);
  110. for (String person : people){
  111. String currentState = personHealthStateMap.get(person).get(personHealthStateMap.get(person).size() - 1);
  112. if (!currentState.equals("HEALTHY")){
  113. return true;
  114. }
  115. }
  116. return false;
  117. }
  118.  
  119. public void updateLocation(String person, String prevLocation, String nextLocation, Map<String, Set<String>> locationToPeopleMap){
  120. Set<String> personsInCurrentLoc = locationToPeopleMap.getOrDefault(prevLocation, Collections.EMPTY_SET);
  121. personsInCurrentLoc.remove(person);
  122. if (!locationToPeopleMap.containsKey(nextLocation)){
  123. locationToPeopleMap.put(nextLocation, new HashSet<>());
  124. }
  125. locationToPeopleMap.get(nextLocation).add(person);
  126. }
  127.  
  128. public String nextDayState(String state, boolean hasSick){
  129. if ("SICK".equals(state)){
  130. return "RECOVERING";
  131. }
  132. if ("RECOVERING".equals(state)){
  133. return "HEALTHY";
  134. }
  135. if ("HEALTHY".equals(state) && hasSick){
  136. return "SICK";
  137. }
  138. return "HEALTHY";
  139. }
  140. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement