코딩문제풀이/Baekjoon

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

코딩하는 포메라니안 2023. 1. 5. 22:35

1. 문제

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

 

19583번: 싸이버개강총회

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

www.acmicpc.net

 

 

2. 풀이 과정

시간을 ":"을 기준으로 잘라서 int로 변환하여 분단위로 비교하였다.

시작시간보다 빨리 채팅을 친 사람들을 Set에 넣으며 중복 제거를 함께 해주었다.

종료시간과 스트리밍 종료시간 사이에 채팅을 친 사람은 Set에서 빼주면서 결과값을 구하였다.

 

추가적으로 입력이 언제 종료되는지 모르기 때문에, EOF검사를 해주어야 한다.

Scanner 같은 경우에는 hasNext() 메서드를 제공하지만, BufferedReader는 null검사로 해주면 된다.

백준에서는 파일로 입출력이 들어오기 때문에, 위와 같이 처리하면 잘 돌아갔다.

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

public class Main {
    
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int S = stoi(st.nextToken());
        int E = stoi(st.nextToken());
        int Q = stoi(st.nextToken());

        Set<String> participants = new HashSet<>();
        int result = 0;
        String record;
        while ((record = br.readLine()) != null) {
            st = new StringTokenizer(record);
            int time = stoi(st.nextToken());
            String name = st.nextToken();

            if(time <= S){
                participants.add(name);
            }
            else if(E <= time && time <= Q){
                if(participants.contains(name)){
                    participants.remove(name);
                    result++;
                }
            }
        }

        System.out.println(result);

    }

    public static int stoi(String time){
        String[] temp = time.split(":");
        return Integer.parseInt(temp[0])*60 + Integer.parseInt(temp[1]);
    }
}

 

 

결과