Algorithm/백준(BOJ)

[백준] 19583. 싸이버개강총회 (Java)

Carroti 2022. 9. 19. 20:26

🔒 문제

 

19583번: 싸이버개강총회

첫번째 줄에는 개강총회를 시작한 시간 S, 개강총회를 끝낸 시간 E, 개강총회 스트리밍을 끝낸 시간 Q가 주어진다. (00:00 ≤ S < E < Q ≤ 23:59) 각 시간은 HH:MM의 형식으로 주어진다. 두번째 줄부터는

www.acmicpc.net

 

🔑 알고리즘

해시셋(HashSet)

 

 

💡  풀이

00:00 와 S 사이에, 그리고 E 와 Q 사이에 채팅을 친 사람의 수를 카운트해야한다.

시간이 00:00~23:59 까지 주어지므로 시각을 숫자로 0 ~ 2359로 바꾸고,

 

채팅을 친 시각이 0 와 S 사이에 있으면 해시셋에 넣고,

채팅을 친 시각이 E 와 Q 사이에 있으면 해시셋에 이름이 있는지 확인하고 있으면 조건을 만족하므로 count를 1 증가시킨다.

이때 똑같은 사람이 여러번 카운트되지 않도록 count를 증가시킨 후에 셋에서 제거한다.

 

 

✏️ 코드

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.HashSet;
import java.util.StringTokenizer;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		HashSet<String> set = new HashSet<>();
		StringTokenizer st = new StringTokenizer(br.readLine(), " ");
		int S = Integer.parseInt(st.nextToken().replace(":",""));
		int E = Integer.parseInt(st.nextToken().replace(":",""));
		int Q = Integer.parseInt(st.nextToken().replace(":",""));
		
		String input = "";
		int count = 0;
		while((input = br.readLine()) != null && !input.isEmpty()) {
			st = new StringTokenizer(input);
			
			int T = Integer.parseInt(st.nextToken().replace(":", ""));
			String name = st.nextToken();
			
			if(T<=S)
				set.add(name);
			
			if(E<=T && T<=Q && set.contains(name)) {
				count++;
				set.remove(name);
			}
		}
		
		System.out.println(count);
	}
}