알고리즘 문제/JAVA
[백준]7785:회사에 있는 사람(JAVA)
공백._.
2024. 4. 16. 21:52
https://www.acmicpc.net/problem/7785
7785번: 회사에 있는 사람
첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는
www.acmicpc.net
- 풀이방법[알고리즘]
퇴근 못 한 불쌍한 사람을 찾는 문제. 정렬 연습하려고 풀어보았다. ArrayList로 풀었더니 시간초과가 떴다. remove()는 O(n)이고 for문을 돌기 때문에 O(n^2)가 되어 시간초과가 된다고 한다. 아직 시간복잡도까지 계산해서 푸는건 너무 헷갈린당..... HashMap으로 leave 인 경우 map에서 삭제해주는 것으로 했다. HashMap의 키Set을 List로 받아 Collection.sort(lkeySet,Collection.reverseOrder())를 사용해 내림차순으로 정렬한 후 출력하면 끝!
public class Main {
//B7785회사에있는사람_240416
public static void main(String[] args) throws Exception{
//로그가 주어졌을 때 회사에 있는구하기 -> 사전의 역순으로 구하기
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
StringBuilder sb = new StringBuilder();
int N = Integer.parseInt(st.nextToken());
HashMap<String,String>list = new HashMap<>();
String name="";
String el="";
for(int i=0;i<N;i++){
st = new StringTokenizer(br.readLine());
name=st.nextToken();
el= st.nextToken();
if(el.equals("enter")){
list.put(name,"enter");
}else{
list.remove(name);
}
}
// String[]names = list.toArray(new String[list.size()]);
// Arrays.sort(names,Comparator.reverseOrder());
ArrayList<String>keySet = new ArrayList<>(list.keySet());
Collections.sort(keySet,Collections.reverseOrder());
for(String str:keySet){
sb.append(str).append("\n");
}
sb.trimToSize();
System.out.print(sb);
}//main
}//class