
현재 회사에 남아있는 사람을 이름 내림차순으로 정렬하는 문제이다.
처음엔 ArrayList로 회사 사람들의 출입을 관리하고자 설계했었다.
import java.util.*;
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
List<String> list = new ArrayList<>();
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine(), " ");
String name = st.nextToken();
String offer = st.nextToken();
if(offer.equals("enter")){
list.add(name);
}else if(offer.equals("leave")){
list.remove(name);
}
}
Collections.sort(list, (s1, s2) -> s2.compareTo(s1) );
for(String s : list){
bw.write(s + "\n");
}
br.close();
bw.flush();
bw.close();
}
}
시간 초과
HashSet과 달리 ArrayList는 순서가 존재하기 때문에
remove로 탐색할 때 순서대로 탐색하기 때문에
시간이 오래 걸리게 된다.
그러므로 순서를 상관하지 않는 HashSet으로
회사에 남아있는 사람들을 모은 후
ArrayList로 바꾼 후 정렬하면 된다.
위 정보를 바탕으로 설계한 코드는 다음과 같다.
import java.util.*;
import java.io.*;
class Main{
public static void main(String[] args) throws IOException{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
HashSet<String> set = new HashSet<>();
for(int i=0; i<n; i++){
st = new StringTokenizer(br.readLine(), " ");
String name = st.nextToken();
String rest = st.nextToken();
if(rest.equals("enter")){
set.add(name);
}else if(rest.equals("leave")){
set.remove(name);
}
}
List<String> list = new ArrayList<>(set);
Collections.sort(list, (s1, s2) -> s2.compareTo(s1));
for(String s : list){
bw.write(s + "\n");
}
br.close();
bw.flush();
bw.close();
}
}
맞았습니다!!