본문 바로가기
코딩테스트 준비/백준

[백준] 19583번 - 싸이버개강총회 [Java]

by mwzz6 2024. 12. 24.

https://www.acmicpc.net/problem/19583

 

[백준] 19583번 - 싸이버개강총회 [Java]
[백준] 19583번 - 싸이버개강총회 [Java]
[백준] 19583번 - 싸이버개강총회 [Java]


1.  아이디어

 

String의 compareTo 메서드와 Set 자료구조를 통해 출석이 확인된 학회원의 수를 구할 수 있다.


2. 문제풀이

 

HH:MM 형식의 문자열은 String의 compareTo 메서드로 비교를 하면 시간순(사전순)으로 비교할 수 있다. 이를 활용해서 채팅이 출석 기준이 되는 시간에 기록된 채팅인지 파악했다. 개강총회 시작 전에 채팅 기록을 남긴 학회원을 entry에 담고, 개강총회를 끝내고 나서 스트리밍을 끝낼 때까지 채팅 기록을 남긴 학회원을 exit에 담은 후 retainAll 메서드로 교집합을 구해서 크기를 출력하는 방식으로 구현했다.


3. 코드

 

import java.io.*;
import java.util.*;

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> entry = new HashSet<>();
        Set<String> exit = new HashSet<>();

        String input;
        while ((input = br.readLine()) != null) {
            st = new StringTokenizer(input);

            String time = st.nextToken();
            String name = st.nextToken();

            if (before(time, S)) {
                entry.add(name);
            } else if (after(time, E) && before(time, Q)) {
                exit.add(name);
            }
        }

        entry.retainAll(exit);

        System.out.println(entry.size());
    }

    private static boolean before(String time, String criterion) {
        return time.compareTo(criterion) <= 0;
    }

    private static boolean after(String time, String criterion) {
        return time.compareTo(criterion) >= 0;
    }

}

4. 후기