Problem Solving/Baekjoon
[백준] 7785 회사에 있는 사람 - Data Structure / Java
graycode
2022. 7. 25. 18:55
• 문제 링크
7785번: 회사에 있는 사람
첫째 줄에 로그에 기록된 출입 기록의 수 n이 주어진다. (2 ≤ n ≤ 106) 다음 n개의 줄에는 출입 기록이 순서대로 주어지며, 각 사람의 이름이 주어지고 "enter"나 "leave"가 주어진다. "enter"인 경우는
www.acmicpc.net
• 풀이 과정
문제에 제시된 조건 중 동명이인이 없음, 즉 중복을 허용하지 않으므로 Set 자료구조를 활용한다.
또는 Map 자료구조의 key 값으로 구현 가능하며 이때 Set 과 Map 은 List 대비 속도면에서 우위를 가진다.
입력받은 출입 기록 중 state 변수에 저장된 문자열이 "enter" 일때 Set 에 name 값을 저장하고
그 외의 경우는 state = "leave" 로써 Set 에 입력된 name 값이 존재 시, 해당 값을 삭제한다.
값 입출이 완료된 Set 을 List 자료구조로 변환 및 내림차순으로 정렬하여 모든 요소를 정답으로써 출력한다.
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
import java.util.StringTokenizer;
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));
StringTokenizer st;
int n = Integer.parseInt(br.readLine());
Set<String> log = new HashSet<>();
for (int i = 0; i < n; i++) {
st = new StringTokenizer(br.readLine());
String name = st.nextToken();
String state = st.nextToken();
if (state.equals("enter"))
log.add(name);
else if (log.contains(name))
log.remove(name);
}
List<String> list = new ArrayList<>(log);
list.sort(Comparator.reverseOrder());
for (String s : list)
bw.write(s + "\n");
bw.flush();
}
}