문제 해석
- 첫번째 줄에 출입 기록 수(N)을 입력받고, 출입 기록 수(N)만큼 출입 기록이 순서대로 주어진다.
- 그 출입 기록은 출입한 사람이름과 enter(출근) or leave(퇴근)이 주어지는데, 현재 회사에 남아있는 사람을 출력하면 되는 문제이다.
- 다시 말해 퇴근하지 않은 모든 사람의 이름을 출력하면된다. 단, 사람의 이름을 사전 순의 역순으로 한 줄에 한명식 출력해야한다.
틀린 코드
import java.io.*;
import java.util.*;
public 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));
int N = Integer.parseInt(br.readLine());
HashMap<String, String> workArray = new HashMap<String, String>();
for (int i = 0; i < N; i++){
StringTokenizer st = new StringTokenizer(br.readLine());
workArray.put(st.nextToken(), st.nextToken());
}
br.close();
List<String> keyset = new ArrayList<String>(workArray.keySet());
Collections.reverse(keyset);
for(String key : keyset){
if(workArray.get(key).equals("enter")){
bw.write(key + "\n");
}
}
bw.flush();
bw.close();
}
}
- 해시맵을 사용하면 간단하게 풀릴 것 같아서 코드를 이렇게 작성했지만...
틀린 결과
맞은 코드
import java.io.*;
import java.util.*;
public 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));
int N = Integer.parseInt(br.readLine());
HashSet<String> workArray = new HashSet<>();
for (int i = 0; i < N; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String key = st.nextToken();
String value = st.nextToken();
if(value.equals("enter")){
workArray.add(key);
}else if(value.equals("leave")){
workArray.remove(key);
}
}
br.close();
ArrayList<String> list = new ArrayList<String>(workArray);
Collections.sort(list);
for(int i = list.size()-1; i >= 0; i--){
bw.write(list.get(i) + "\n");
}
bw.flush();
bw.close();
}
}
- hashmap을 사용했을 경우 왜 틀렸는지는 모르겠지만, 추측으로는 시간초과인 것 같다.(map을 사용할 경우 key의 검색 속도가 속도를 좌우한다. 하지만 hashset은 key값이 따로 존재하지 않으므로 시간이 덜 들지 않을까라는 생각...?) 잘 모르겠지만...
- 그래서 hashset을 사용하였고, 퇴근의 경우를 값을 갱신하는 것이 아닌 해당 값이 퇴근(leave)이면 hashset에서 삭제해 주었다. (반복문이 덜 돌 것이다. 풀로 저장하는 것 보다)
맞은 결과
느낀 점
- 정말 hashMap의 문제였나보다... 요즘 코드를 보면서, 이게 맞나 저게 맞나 헷갈리고 뭐가 속도를 줄일 수 있는지도 막 헷갈리는데 어디서 잡아야할지 모르겠다.