白駿7785社の人解答(JAVA)


質問リンク
質問する
尚根は世界的なソフトウェア会社のGiggleで働いています.この会社の最大の特徴は自由な通勤時間です.そのため、従業員たちは9時から6時まで会社にいる必要はありません.
従業員一人一人が自分が望む時に出勤して、いつでも退勤することができます.
尚根にはすべての人がカードシステムに出入りするログがある.このログには、誰が会社に入ったのか、誰が外出したのかが記録されています.ログがある場合は、現在の会社のすべての人を救うプログラムを作成します.
入力
1行目は、ログに記録された出入り記録数nを与える.(2≦n≦106)ではn行に順次出入り記録が与えられ,各人の名前には「enter」または「leave」が与えられる.「enter」は出勤、「leave」は退勤です.
会社に同名の人はいませんが、大文字と小文字が異なる場合は別の名前です.人々の名前はアルファベットの大文字と小文字からなる5文字以下の文字列です.
しゅつりょく
現在、会社の人名は辞書順の逆順で1行印刷されています.
に答える
思ったより簡単です.出勤するときは社員の名前をスーツに入れ、退勤するときは消します.そしてリストで正しく並べ替えたら!
最初は直接リストに置いて、退勤して削除して、結局タイムアウトしました.いずれにしても、リストで探索するには時間がかかるようです.
ソースコード
import java.util.*;
import java.io.*;
public class Main{
    
    public static void main(String [] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st;
        final int NUMBER_OF_INPUT = Integer.parseInt(br.readLine());
        Set<String> company = new HashSet<String>();
        for(int i=0;i<NUMBER_OF_INPUT;i++) {
            st = new StringTokenizer(br.readLine());
            String name = st.nextToken();
            String activity = st.nextToken();
            if(activity.charAt(0)=='e') {
                company.add(name);
            }else {
                company.remove(name);
            }
        }
        List<String> companyList = new ArrayList<String>(company);
        companyList.sort(Comparator.reverseOrder());
        for(String k : companyList) {
            sb.append(k);
            sb.append("\n"); 
        }
        
        bw.write(sb.toString());
        
        bw.flush();
        br.close();
        bw.close();
        
    }