Java Code for The Relationship (TCS Codevita) | PrepInsta

The Relationship

TCS CodeVita is a coding competition organized by TCS every year, in search of world’s best coder. This is a global level coding competition in which coders from all around the world compete for the title of World’s Best Coder. The Relationship is one of the sample problem of this year TCS CodeVita season 11 competition. 

relationship tcs codevita

Question -: The people of Kingdoms of Westeros are very organized. They are very devoted to their leader and cannot live without a leader even for a single day. Marriages, divorces, births, and deaths are everyday things in Westeros and because of these events people of Westeros need to spend their time on choosing the leader. People badly need a programme to find the new leader in case of these events. The criteria to choose the leader is as below.

Run
import java.util.Scanner;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import java.util.ArrayList;
import java.util.Collections;
class Person {
    String firstname;
    String familyname;
    String birthfamilyname;
    String gender;
    String fathername;
    String spousename;
    int age;
    String leadername;
    Person(String firstname, String familyname, String birthfamilyname, String gender, String fathername, String spousename, int age) {
        this.firstname = firstname;
        this.familyname = familyname;
        this.birthfamilyname = birthfamilyname;
        this.gender = gender;
        this.fathername = fathername;
        this.spousename = spousename;
        this.age = age;
        this.leadername = firstname;
    }
}
public class FamilyTree {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        int N = scanner.nextInt();
        Map people = new HashMap<>();
        for (int i = 0; i < N; i++) {
            String firstname = scanner.next();
            String familyname = scanner.next();
            String birthfamilyname = scanner.next();
            String gender = scanner.next();
            String fathername = scanner.next();
            String spousename = scanner.next();
            int age = scanner.nextInt();
            Person person = new Person(firstname, familyname, birthfamilyname, gender, fathername, spousename, age);
            people.put(firstname, person);
        }
        int E = scanner.nextInt();
        scanner.nextLine();
        for (int i = 0; i < E; i++) {
            String event = scanner.nextLine();
            if (event.equals("PA")) {
                List alivePeople = new ArrayList<>();
                for (Person person : people.values()) {
                    if (person.age > 0) {
                        alivePeople.add(person.firstname);
                    }
                }
                Collections.sort(alivePeople);
                for (String personName : alivePeople) {
                    Person person = people.get(personName);
                    System.out.println(person.firstname + " " + person.familyname + " " + person.birthfamilyname + " " +
                            person.gender + " " + person.fathername + " " + person.spousename + " " + person.age + " " + person.leadername);
                }
            } else if (event.startsWith("PO")) {
                String name = event.substring(3);
                Person person = people.get(name);
                System.out.println(person.firstname + " " + person.familyname + " " + person.birthfamilyname + " " +
                        person.gender + " " + person.fathername + " " + person.spousename + " " + person.age + " " + person.leadername);
            } else if (event.startsWith("MA")) {
                String[] parts = event.split(" ");
                String person1 = parts[1];
                String person2 = parts[2];
                String family1 = people.get(person1).familyname;
                String family2 = people.get(person2).familyname;
                people.get(person1).spousename = person2;
                people.get(person2).spousename = person1;
                if (!family1.equals(family2)) {
                    chooseLeader(family1, people);
                    chooseLeader(family2, people);
                }
            } else if (event.startsWith("DI")) {
                String[] parts = event.split(" ");
                String person1 = parts[1];
                String person2 = parts[2];
                people.get(person1).spousename = "NA";
                people.get(person2).spousename = "NA";
                String family1 = people.get(person1).familyname;
                String family2 = people.get(person2).familyname;
                chooseLeader(family1, people);
                chooseLeader(family2, people);
            } else if (event.startsWith("BI")) {
                String[] parts = event.split(" ");
                String name = parts[1];
                String gender = parts[2];
                String father = parts[3];
                String mother = parts[4];
                Person person = people.get(name);
                person.familyname = people.get(father).familyname;
                person.birthfamilyname = people.get(father).familyname;
                person.fathername = father;
                person.spousename = "NA";
                chooseLeader(people.get(father).familyname, people);
            } else if (event.startsWith("DE")) {
                String personName = event.split(" ")[1];
                Person person = people.get(personName);
                person.age = -1;
                chooseLeader(person.familyname, people);
            } else if (event.startsWith("YP")) {
                int years = Integer.parseInt(event.split(" ")[1]);
                for (Person person : people.values()) {
                    if (person.age > 0) {
                        person.age += years;
                    }
                }
            }
        }
    }
    private static void chooseLeader(String familyname, Map people) {
        List familyMembers = new ArrayList<>();
        for (Person person : people.values()) {
            if (person.familyname.equals(familyname)) {
                familyMembers.add(person.firstname);
            }
        }
        Collections.sort(familyMembers);
        String leader = familyMembers.get(0);
        for (String member : familyMembers) {
            if (people.get(member).age > people.get(leader).age) {
                leader = member;
            }
        }
        people.get(leader).leadername = leader;
        for (String member : familyMembers) {
            people.get(member).leadername = leader;
        }
    }
}