백준 7785 - 회사에 있는 사람 (java)

J·2022년 9월 17일
0

알고리즘 문제풀이

목록 보기
6/21

문제 정리


회사에 출입한 사람들 중
아직 회사에 남아 있는 사람을 찾는 것이 목표이다

입력

출입 기록 수
출입한사람 enter or leave

출력

아직 회사에 남아 있는 사람을 사전 역순으로
한 줄에 한 명씩 이름 출력

idea 정리


HashSet을 쓰려면 enter 한 사람은 그 다음 기록이 무조건 leave라는 보장이 있어야 하는데
그런 조건은 딱히 안주어져서 다른 자료구조를 써야 한다고 생각했다
두 가지 값을 넣으면서 hash가 가능한건 HashMap밖에 모르는데 HashMap을 쓰게되면 정렬 할 때 key와 value 각각을 List로 빼와서 정렬하는 수 밖에 없었다
그러다가 발견한 것이 TreeMap인데 생성자에 comparator를 지정해주면 key, value쌍을 put할 때 자동 정렬이 된다!!
그리고 map.entrySet()으로 key, value를 묶은 객체를 빼올수 있다는것도 알게됐다

알고리즘 정리


  1. treemap에 값을 넣어주면서 만약 없던 값이면 그냥 put
    있던 값이면 있던 값을 삭제해주고 새로 put (enter, leave 상관 X)
  2. treemap에 저장된 값을 for문으로 돌면서 value가 enter인 사람 출력

구현


//회사에 있는 사람
public class Main {
	public static void main(String[] args) throws NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
		
		int N = Integer.parseInt(br.readLine());
		Comparator<String> comparator = (s1, s2)-> s2.compareTo(s1);
		Map<String, String> employees = new TreeMap<>(comparator);
		
		for(int i=0; i<N; i++) {
			StringTokenizer st = new StringTokenizer(br.readLine(), " ");
			String name = st.nextToken();
			String state = st.nextToken();
			if(!employees.containsKey(name))
				employees.put(name, state);
			else {
				employees.remove(name);
				employees.put(name, state);
			}
		}
		
		for(Map.Entry<String, String> person : employees.entrySet()) {
			if(person.getValue().equals("enter")) {
				bw.write(person.getKey() + "\n");
			}
		}
		bw.flush();
		bw.close();
		br.close();
	}
}

결과


0개의 댓글