https://www.acmicpc.net/problem/2884
2884번: 알람 시계
상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,
www.acmicpc.net
Answer
import java.io.InputStreamReader;
import java.io.BufferedReader;
import java.io.IOException;
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 H = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
int HOUR_FOR_DAY = 24;
int MINUTE_FOR_DAY = 60;
int EARLY_TIME = 45;
int alarmH = H;
int alarmM = M - EARLY_TIME;
if(alarmM < 0) {
if(H == 0)
alarmH += HOUR_FOR_DAY;
alarmH--;
alarmM += MINUTE_FOR_DAY;
}
System.out.printf("%d %d", alarmH, alarmM);
br.close();
}
}
Code Explanation
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
`System.in`으로 사용자로부터 입력받은 데이터를 바이트 스트림으로 받는다.
`InputStreamReader` 클래스로 바이트 기반 스트림을 문자 기반 스트림으로 연결시켜 준다.
`BufferedReader` 클래스로 사용자가 입력한 문자 스트림을 읽는다.
StringTokenizer st = new StringTokenizer(br.readLine(), " ");
int H = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
`StringTokenizer` 클래스로 `BufferedReader`로 받은 문자열 한 행을 공백 구분자로 나눈다.
`st.nextToken()`으로 공백으로 구분된 문자열을 순서대로 반환한다.
int HOUR_FOR_DAY = 24;
int MINUTE_FOR_DAY = 60;
int EARLY_TIME = 45;
int alarmH = H; // ex) 0
int alarmM = M - EARLY_TIME; // ex) 30 - 45 = -15
if(alarmM < 0) {
if(H == 0)
alarmH += HOUR_FOR_DAY; // 0 + 24 = 24
alarmH--; // 24 - 1 = 23
alarmM += MINUTE_FOR_DAY; // -15 + 60 = 45
}
수학 연산이 필요한 두 가지(시간, 분) 식을 위한 가독성도 고려하는 것이 좋을 것 같다.
br.close();
이 문제와 같은 표준 입출력에서 큰 문제는 없다.
하지만 resource(DB, Network, File) 데이터에 대한 입출력에서는 resource 손상이 발생할 수도 있고, GC가 자동으로 모두 완료될 때까지 `BufferedReader`에 할당된 resource가 그대로 유지되고 있기 때문에 최적화를 위해 `close()`를 선언하여 resource를 반환해 주는 것이 좋을 것 같다.