Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * To change this license header, choose License Headers in Project Properties.
- * To change this template file, choose Tools | Templates
- * and open the template in the editor.
- */
- package javaapplication1;
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.HashMap;
- import java.util.HashSet;
- import java.util.List;
- import java.util.Map;
- import java.util.Set;
- /**
- *
- * @author Jason Wang
- */
- public class Sick {
- public static void main(String[] args){
- }
- public String[] allHealthy(String[] everyone){
- Map<String, List<String>> personItenariesMap = new HashMap<>();
- Map<String, List<String>> personHealthStateMap = new HashMap<>();
- Map<String, Set<String>> locationToPeopleMap = new HashMap<>();
- for (String person : everyone){
- String[] personWithLocations = person.split(" ");
- String name = personWithLocations[0];
- String personState = personWithLocations[1];
- List<String> stateList = new ArrayList<>();
- List<String> locationList = new ArrayList<>();
- for (int i = 2; i < personWithLocations.length ; i ++){
- if (i == 2){
- updateLocation(name, "", personWithLocations[i], locationToPeopleMap);
- }
- locationList.add(personWithLocations[i]);
- }
- stateList.add(personState);
- personItenariesMap.put(name, locationList);
- personHealthStateMap.put(name, stateList);
- }
- int day = 1;
- boolean everyHealthy = false;
- while (day <= 365 && everyHealthy){
- everyHealthy = true;
- for (String person : personItenariesMap.keySet()){
- int personLocationIndex = -1;
- if (day <= personItenariesMap.get(person).size()){
- personLocationIndex = day;
- } else {
- personLocationIndex = day % personItenariesMap.get(person).size() - 1;
- }
- String personLocation = personItenariesMap.get(person).get(personLocationIndex);
- boolean hasSickPpl = arePplSickAtLocation(personLocation, locationToPeopleMap, personHealthStateMap);
- String nextDayState = nextDayState(personHealthStateMap.get(person).get(personHealthStateMap.get(person).size()-1), hasSickPpl);
- if (!nextDayState.equals("HEALTHY")){
- everyHealthy = false;
- }
- personHealthStateMap.get(person).add(nextDayState);
- }
- for (String person : personItenariesMap.keySet()){
- int personPreviousLocationIndex = -1;
- if (day <= personItenariesMap.get(person).size()){
- personPreviousLocationIndex = day;
- } else {
- personPreviousLocationIndex = day % personItenariesMap.get(person).size() - 1;
- }
- int personNextLocationIndex = -1;
- if (day +1 <= personItenariesMap.get(person).size()){
- personNextLocationIndex = day + 1;
- } else {
- personNextLocationIndex = (day + 1) % personItenariesMap.get(person).size() - 1;
- }
- String personPrevLocation = personItenariesMap.get(person).get(personPreviousLocationIndex);
- String personNextLocation = personItenariesMap.get(person).get(personPreviousLocationIndex);
- // in the end, update location
- updateLocation(person, personPrevLocation, personNextLocation, locationToPeopleMap);
- }
- day++;
- }
- String[] days = new String[day + 2];
- List<String> persons = new ArrayList<>();
- StringBuilder sb = new StringBuilder();
- for (String person : personHealthStateMap.keySet()){
- persons.add(person);
- sb.append(person);
- sb.append(" ");
- }
- days[0] = sb.toString().trim();
- for (int i = 0; i < day ; i ++){
- StringBuilder sb2 = new StringBuilder();
- for (String p : persons){
- sb2.append(personHealthStateMap.get(p).get(i));
- sb2.append(" ");
- }
- days[i + 1] = sb2.toString().trim();
- }
- days[days.length - 1] = day + "";
- return days;
- }
- public boolean arePplSickAtLocation(String location, Map<String, Set<String>> pplAtLocation, Map<String, List<String>> personHealthStateMap ){
- Set<String> people = pplAtLocation.get(location);
- for (String person : people){
- String currentState = personHealthStateMap.get(person).get(personHealthStateMap.get(person).size() - 1);
- if (!currentState.equals("HEALTHY")){
- return true;
- }
- }
- return false;
- }
- public void updateLocation(String person, String prevLocation, String nextLocation, Map<String, Set<String>> locationToPeopleMap){
- Set<String> personsInCurrentLoc = locationToPeopleMap.getOrDefault(prevLocation, Collections.EMPTY_SET);
- personsInCurrentLoc.remove(person);
- if (!locationToPeopleMap.containsKey(nextLocation)){
- locationToPeopleMap.put(nextLocation, new HashSet<>());
- }
- locationToPeopleMap.get(nextLocation).add(person);
- }
- public String nextDayState(String state, boolean hasSick){
- if ("SICK".equals(state)){
- return "RECOVERING";
- }
- if ("RECOVERING".equals(state)){
- return "HEALTHY";
- }
- if ("HEALTHY".equals(state) && hasSick){
- return "SICK";
- }
- return "HEALTHY";
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement