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

2 분 소요

문제 링크

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


풀이 과정

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

먼저 개강총회를 시작한 시간 S, 개강총회를 끝낸 시간 E, 개강총회 스트리밍을 끝낸 시간 Q 를 입력받습니다.

시간은 calTime 메소드 를 통해 분단위로 변환했습니다. 입력이 HH:mm의 패턴으로 들어오므로, 구분자 : 를 기분으로 앞, 뒤가 잘려 만들어진 배열을 파라미터로 전달해, 분으로 환산된 정수 값을 받아 각각 저장합니다.


static int calTime(String str) {
    String[] splited = str.split(":");
    int hour = Integer.parseInt(splited[0]);
    int min = Integer.parseInt(splited[1]);

    return hour * 60 + min;
}

calTime 메소드 는 시간, 분을 분단위의 정수로 환산하고 이 값을 리턴합니다. 배열의 0번 인덱스에는 시간이, 1번 인덱스에는 이 들어있으므로, 시간에 60을 곱해 분을 더함으로써 분단위로 변환했습니다.


while ((input = br.readLine()) != null) {
    ...
}

문제의 입력이 최대 10만줄이므로 BufferedReader 객체를 사용했고, 입력의 종료가 주어지지 않았으므로 EOF 을 만날 때까지 계속해서 입력을 받아야 합니다. 위 코드와 같이 입력을 받은 문자열 객체가 null 이 아니면 입력이 들어온 것으로 판단해 while 문 몸체를 실행했습니다. EOF 을 만나 입력이 종료되면 그만두게 됩니다.


Scanner sc = new Scanner(System.in);

while(sc.hasNextLine()) {
    String input = sc.nextLine();
}

참고로, Scanner 를 통해 EOF 까지 입력을 받는 방법은 위와 같습니다.


while ((input = br.readLine()) != null) {
    st = new StringTokenizer(input);
    int time = calTime(st.nextToken());
    String name = st.nextToken();

    if (time <= S) {
        enter.add(name);
        continue;
    }

    if (E <= time && time <= Q && enter.contains(name)) {
        answer++;
        enter.remove(name);
    }
}

위에서 본 while 문 몸체입니다. 입력으로부터 시간과 이름을 구분짓고, 시간은 정수로의 변환을 위해 calTime 메소드 를 호출한 리턴값으로 저장합니다.

  • 시간이 개총 시작 시간 전이면 enter 라는 Set 에 넣어, 입장 확인을 해 두었습니다.
  • 시간이 개총 끝난 시간부터 개총 스트리밍이 끝난 시간 사이면, 퇴장 메세지에 해당합니다. 퇴장 메세지는 입장 확인이 된 학생들에게만 유효하므로 contains 메소드 를 호출해 입장 확인이 된 학생인지 확인합니다. 확인이 되면, 그 학생은 출석부에서 제거한 뒤, 출석 확인(answer++)을 시킵니다.


코드

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));
        StringTokenizer st = new StringTokenizer(br.readLine());
        int S = calTime(st.nextToken());
        int E = calTime(st.nextToken());
        int Q = calTime(st.nextToken());
        HashSet<String> enter = new HashSet<>();
        int answer = 0;
        String input = null;

        while ((input = br.readLine()) != null) {
            st = new StringTokenizer(input);
            int time = calTime(st.nextToken());
            String name = st.nextToken();

            if (time <= S) {
                enter.add(name);
                continue;
            }

            if (E <= time && time <= Q && enter.contains(name)) {
                answer++;
                enter.remove(name);
            }
        }

        System.out.println(answer);
    }

    static int calTime(String str) {
        String[] splited = str.split(":");
        int hour = Integer.parseInt(splited[0]);
        int min = Integer.parseInt(splited[1]);

        return hour * 60 + min;
    }
}

카테고리:

업데이트:

댓글남기기