문제 출처 - Baekjoon Online Judge
문제는 여기
[문제]
상근이는 세계적인 소프트웨어 회사 기글에서 일한다. 이 회사의 가장 큰 특징은 자유로운 출퇴근 시간이다. 따라서, 직원들은 반드시 9시부터 6시까지 회사에 있지 않아도 된다.
각 직원은 자기가 원할 때 출근할 수 있고, 아무때나 퇴근할 수 있다.
상근이는 모든 사람의 출입카드 시스템의 로그를 가지고 있다. 이 로그는 어떤 사람이 회사에 들어왔는지, 나갔는지가 기록되어져 있다. 로그가 주어졌을 때, 현재 회사에 있는 모든 사람을 구하는 프로그램을 작성하시오.
[입력]
첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는 출근, "leave"인 경우는 퇴근이다.
회사에는 동명이인이 없으며, 대소문자가 다른 경우에는 다른 이름이다. 사람들의 이름은 알파벳 대소문자로 구성된 5글자 이하의 문자열이다.
[출력]
현재 회사에 있는 사람의 이름을 사전 순의 역순으로 한 줄에 한 명씩 출력한다.
[풀이]
1. 해쉬셋을 사용해 출입 상황에 따라 저장, 삭제를 해준다.
2. 해쉬셋의 정보를 리스트에 담아준다.
3. 리스트를 정렬시키고 뒤에서부터 출력시킨다. (사전 역순 출력)
[접근]
1. 해쉬셋을 통해 저장을 시킨다.
2. 해쉬셋에 남아있는 내용을 리스트에 저장시킨다.
[코드]
package BOJ_silver;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashSet;
import java.util.StringTokenizer;
public class Main_S5_7785 {
static int n;
static HashSet<String> log;
static ArrayList<String> list;
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
n = Integer.parseInt(br.readLine());
log = new HashSet<>();
list = new ArrayList<>();
for (int i = 0; i < n; i++) {
StringTokenizer st = new StringTokenizer(br.readLine());
String name = st.nextToken(); // 이름
String status = st.nextToken(); // enter or leave의 상태
// 만약 enter라면 해쉬셋에 저장
if (status.compareTo("enter") == 0) {
log.add(name);
}
else {
if (log.contains(name)) // 있는지 체크하고
log.remove(name); // 있다면 제거
}
}
// 리스트에 해쉬 내용을 담아준다.
list = new ArrayList(log);
// 정렬 시키기
Collections.sort(list);
// 사전 역순으로 출력
for (int i = list.size() - 1; i >= 0; i--) {
System.out.println(list.get(i));
}
}
}
'문제 풀이 > Baekjoon' 카테고리의 다른 글
[백준] S3 1269번 대칭 차집합 (JAVA) (0) | 2021.10.04 |
---|---|
[백준] G5 17135번 캐슬 디펜스 (JAVA) (0) | 2021.10.04 |
[백준] S3 14425번 문자열 집합 (JAVA) (0) | 2021.10.03 |
[백준] G2 17143번 낚시왕 (JAVA) (0) | 2021.10.02 |
[백준] S4 1755번 숫자놀이 (JAVA) (0) | 2021.09.30 |