[백준] 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;
}
}
댓글남기기