자료구조/문제풀이
[백준 JAVA] 19583 싸이버개강총회
휴먼코딩
2024. 9. 27. 20:50
19583 싸이버개강총회
https://www.acmicpc.net/problem/19583
문제설명
스트리밍에서 특정 시간 범위에 참석한 사람들을 찾는다.
- S: 시작 시간
- E: 종료 시간
- Q: 질문 시간
여러 사람의 출입 기록이 주어지며 각 기록은 시간과 이름으로 이루어져 있다.
S 시간 이전에 이벤트에 참석한 사람들 중 E 시간 이후 Q 시간 이전에도 참석한 사람들의 수를 세는 것이다.
문제풀이
- Set 사용:
- S 시간 이전에 들어온 사람들의 이름을 저장한다.
- E 시간 이후 Q 시간 이전에 들어온 사람들의 이름을 저장한다.
- 모든 참석자의 이름을 저장한다.
- 시간 비교:
- 각 기록의 시간과 S, E, Q를 비교하여 적절한 Set에 이름을 추가한다.
- Set에 모두 포함된 사람의 수를 세어 출력한다.
O(N+M) 시간복잡도
- 입력 처리: 각 출입 기록을 한 번씩 읽으므로 O(N)이다. 여기서 N은 입력된 기록의 수이다.
- Set의 탐색 및 삽입: Set에 삽입과 탐색을 수행하는데 상수 O(1)의 시간 복잡도를 가진다.
- 결과 계산: nameSet에 있는 모든 이름을 확인하므로 O(M)입니다. 여기서 M은 서로 다른 참석자의 수이다.
전체 알고리즘의 시간 복잡도는 O(N + M)이다.
전체코드
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
String S = st.nextToken();
String E = st.nextToken();
String Q = st.nextToken();
Set<String> before = new HashSet<>();
Set<String> after = new HashSet<>();
Set<String> nameSet = new HashSet<>();
String str = null;
while((str = br.readLine()) != null) {
String[] arr = str.split(" ");
String time = arr[0];
String name = arr[1];
nameSet.add(name);
if(S.compareTo(time) >= 0) {
before.add(name);
}else if(E.compareTo(time) <= 0 && Q.compareTo(time) >= 0) {
after.add(name);
}
}
int ans = 0;
for(String name : nameSet) {
if(before.contains(name) && after.contains(name)) {
ans += 1;
}
}
System.out.println(ans);
}
}