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); } } }