209. Olympic Medal Table

The results of the disciplines are given as a String[] results, where each element is in the format  “GGG SSS BBB”. GGG, SSS and BBB are the 3-letter country codes (three capital letters from ‘A’ to ‘Z’)  of the countries winning the gold, silver and bronze medal, respectively.

The medal table is a String[] with an element for each country appearing in results. Each element has  to be in the format “CCO G S B” (quotes for clarity), where G, S and B are the number of gold, silver  and bronze medals won by country CCO, e.g. “AUT 1 4 1”. The numbers should not have any extra leading zeros.

Sort the elements by the number of gold medals won in decreasing order. If several countries are tied,  sort the tied countries by the number of silver medals won in decreasing order. If some countries are  still tied, sort the tied countries by the number of bronze medals won in decreasing order. If a tie  still remains, sort the tied countries by their 3-letter code in ascending alphabetical order.

import java.util.Arrays;

public class MedalTable {

    private void generate(String[] results) {
        String[] cl = new String[50]; 
        int[] gl = new int[50];
        int[] bl = new int[50];
        int[] sl = new int[50];
        int cid= 0;
        for (int i=0;i<results.length;i++){
            String c[] = results[i].split(" ");
            for (int ci=0;ci<c.length;ci++) {
                String sc = c[ci];
                boolean newcounty = true;
                for (int cli=0;cli<cid;cli++) {
                    if (cl[cli].equals(sc)) {
                        newcounty=false;
                        break;
                    }
                }
                if (newcounty) {
                    int g = 0, s = 0, b = 0;
                    for (int j=i;j<results.length;j++){
                        String r[] = results[j].split(" ");
                        if (r[0].equals(sc)) g++;
                        if (r[1].equals(sc)) s++;
                        if (r[2].equals(sc)) b++;
                    }
                    cl[cid] = sc;
                    gl[cid] = g;
                    sl[cid] = s;
                    bl[cid++] = b;
                    //System.out.println(sc + "\t" + g + "\t" + s + "\t" + b);
                }
            }
        }
        /*System.out.println("Sort");
        for (int i=0;i<cid;i++) {
            String sci = cl[i];
            int gi = gl[i], si = sl[i], bi = bl[i];
            long isum = gi*10000000l+si*1000l+ bi*1l;
            System.out.println(sci + "\t" + gi + "\t" + si + "\t" + bi + "\t" + isum);
        }
        System.out.println("Sort");*/
        for (int i=0;i<cid;i++) {
            String sci = cl[i];
            int gi = gl[i], si = sl[i], bi = bl[i];
            long isum = gi*10000000l+si*1000l+ bi*1l;
            //System.out.println(sci + "\t" + gi + "\t" + si + "\t" + bi);
            for (int j=i+1;j<cid;j++) {
                String scj = cl[j];
                int gj = gl[j], sj = sl[j], bj = bl[j];
                long jsum = gj*10000000l+sj*1000 + bj*1;
                if (jsum>isum){
                    cl[j]= sci;
                    gl[j]=gi;
                    sl[j]=si;
                    bl[j]=bi;
                    
                    sci = cl[i]= scj;
                    gi = gl[i]=gj;
                    si = sl[i]=sj;
                    bi = bl[i]=bj;
                    
                    isum = gj*10000000l+sj*1000l+ bj*1l;
                } else if(jsum==isum && sci.compareToIgnoreCase(scj)>0) {
                    cl[j]= sci;
                    gl[j]=gi;
                    sl[j]=si;
                    bl[j]=bi;
                    
                    sci = cl[i]= scj;
                    gi = gl[i]=gj;
                    si = sl[i]=sj;
                    bi = bl[i]=bj;
                    
                    isum = gj*10000000l+sj*1000l+ bj*1l;
                }
            }
            
            /*System.out.println("\tSort");
            for (int i1=0;i1<cid;i1++) {
                String sci1 = cl[i1];
                int gi1 = gl[i1], si1 = sl[i1], bi1 = bl[i1];
                System.out.println("\t"+sci1 + "\t" + gi1+ "\t" + si1 + "\t" + bi1);
            }*/
        }
        
        String ml[] =new String[cid];
        //System.out.println("Sort");
        for (int i=0;i<cid;i++) {
            String sci = cl[i];
            int gi = gl[i], si = sl[i], bi = bl[i];
            ml[i] = sci + " " + gi + " " + si + " " + bi;
            //System.out.println(sci + "\t" + gi + "\t" + si + "\t" + bi);
        }
        
        System.out.println(Arrays.toString(ml));
    }
        
    public static void main(String[] args) {
        MedalTable mt = new MedalTable();
        mt.generate(new String[]    {"ITA JPN AUS", "KOR TPE UKR", "KOR KOR GBR", "KOR CHN TPE"}     );
        mt.generate(new String[]    {"USA AUT ROM"}     );
        mt.generate(new String[]    {"GER AUT SUI", "AUT SUI GER", "SUI GER AUT"}     );
        mt.generate(new String[]    {"SOL MOZ BOT", "JOR CUB GUA", "TPE MRI BLR", "KEN NRU KSA", "PAK BLR TPE", "MLT CZE BRA", "KAZ TLS NCA", "TLS ECU GBS", "NRU ECU TAN", "ANG PAR CAF", "KGZ KUW PLE", "NRU AZE ANT", "BEL YUG NCA", "CHA KGZ GRE", "PUR CUB KGZ", "PAK THA PUR", "TLS GUA NRU", "KUW GBS ANT", "UGA ARG GBS", "SRI ARG BOT", "ANT MOZ PAK", "SOL EST PUR", "THA GRN RSA", "MLT MRI GBS", "UGA GUY MRI", "KEN CGO KSA", "GBS BOT UGA", "AZE PAK EST", "BOT NGR GRN", "KAZ KUW GUY", "NCA MLT AZE"}     );
        mt.generate(new String[]    {"KEN JAM BAN", "SEN DEN DEN", "PAN BLR RSA", "BAN FRG KAZ", "PAN GAB FIJ", "FIJ TRI ISL", "SEN GAM MAD", "RSA ZIM HON", "ISV SMR RSA", "BAR PER BAN", "NED GAB LES", "SCG DMA UAE", "BRN BAR BAN", "VEN CHN HON", "KAZ ZIM SEN", "TRI FRG RSA", "HON CHN CHI", "BAR AHO CHN", "KSA KAZ BAR", "GAM NED SMR", "JAM HON ERI", "BUL EUN LES", "BUL ISL NZL", "CUB ISL AFG", "NED ARG ZIM", "KEN AFG FRG", "GEO HUN LCA", "LCA KSA MAD", "SMR CHI DEN", "ZIM LCA ZIM", "TRI BUR HUN", "DEN FRG RSA"}     );
        mt.generate(new String[]    {"GER AUT SUI", "AUT SUI GER", "SUI GER AUT"}     );
        mt.generate(new String[]    {"GER AUT SUI", "GER AUT SUI", "GER AUT SUI", "GER AUT SUI", "GER AUT SUI", "GER AUT SUI", "GER AUT SUI", "GER AUT SUI", "GER AUT SUI", "GER AUT SUI", "GER AUT SUI", "GER AUT SUI", "GER AUT SUI"}     );
    }
}
Advertisement

One response to “209. Olympic Medal Table

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

%d bloggers like this: