Exercises

백준 7785

sysout.초코우유 2018. 6. 5. 18:31

INPUT: 첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는 출근, "leave"인 경우는 퇴근이다.

회사에는 동명이인이 없으며, 대소문자가 다른 경우에는 다른 이름이다.


OUTPUT: 현재 회사에 있는 사람의 이름을 사전 순의 역순으로 한 줄에 한 명씩 출력한다.




java util이 제공하는 tree를 사용하였다. 출퇴근이 잦으므로, 삭제와 삽입이 용이한 타입을 선택.

단, ASCII order로 정렬할 경우 문제의 요구와 맞지 않으므로, case를 무시한 채로 정렬하되 그 순서를 뒤집도록 하였고,

이름이 같고 case가 다른 경우를 같게 처리하지 않도록 약간 더 수정.


아래는 코드.

import java.util.Scanner;
import java.util.TreeSet;

public class Main {
	class Name implements Comparable<Name>{
		String name;
		
		Name(){}
		Name(String name){
			this.name = name;
		}
		
		public int compareTo( Name anotherName ) {
			if( name.compareToIgnoreCase(anotherName.name) == 0 ) {
				return -name.compareTo(anotherName.name);
			}
			return -name.compareToIgnoreCase(anotherName.name);
		}
		
		public String toString() {
			return name;
		}
	}	
	
	
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		Main main = new Main();
		
		TreeSet<Name> workingPeople = new TreeSet<Name>();
		int numberOfLog = sc.nextInt();
		
		for( ; numberOfLog > 0 ; numberOfLog-- ) {
			String name = sc.next();
			if( sc.next().equals("enter") ) {
				workingPeople.add( main.new Name(name) );
			} else {
				TreeSet<Name> collec = new TreeSet<Name>();
				collec.add( main.new Name(name) );
				workingPeople.removeAll( collec );
			}
		}
		
		sc.close();
		
		for(Name temp : workingPeople) {
			System.out.println(temp);
		}
	}
}