본문 바로가기
자료구조&알고리즘/해시를 사용한 집합과 맵

[백준] 해시를 사용한 집합과 맵 - 7785번 회사에 있는 사람 (Java)

by _din 2022. 6. 17.

문제링크

 

7785번: 회사에 있는 사람

첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는

www.acmicpc.net

 

접근한 방법

  • 해시맵

풀이방법

  • "enter"일 때는 hashmap에 값을 true로 넣어주고
    "leave"일 때는 hashmap에 값을 false로 대체한다.
  • hashmap을 배열로 변환하여 정렬을 수행한다.

소스코드 작성 방법

  • hashmap을 키는 String, 값은 Boolean으로 선언한다.
  • StringTokenizer로 입력을 받아
    "enter"일 때 key는 이름으로 값은 true로 put한다.
    "leave"일 때 key는 이름으로 값은 false로 replace한다.
  • 키를 배열로 변경하여 저장하고,
    Arrays.sort와 Collections.reverseOrder()로 역순으로 정렬한다.
  • 반복문을 돌며 hashmap의 키 값이 true일 때 출력한다.

 

소스코드

package baekjoon.array_map_using_hash;
import java.io.*;
import java.util.*;

public class Q_7785_PeopleInCompany {
    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, Boolean> hashMap = new HashMap<>();
        for (int i = 0; i < n; i++) {
            StringTokenizer st = new StringTokenizer(br.readLine());
            String name = st.nextToken();
            String type = st.nextToken();
            if(type.equals("enter")) {
                hashMap.put(name, true);
            } else if(type.equals("leave")){
                hashMap.replace(name,false);
            }
        }

        // 키를 배열로 변경
        Object[] arrKey = hashMap.keySet().toArray();
        Arrays.sort(arrKey, Collections.reverseOrder());

        for(Object s : arrKey) {
            if(hashMap.get(s))
                bw.write(s+"\n");
        }

        br.close();
        bw.close();
    }
}
반응형

댓글