https://www.acmicpc.net/problem/2884
백준 온라인 저지(BOJ)의 첫 번째 단계인 "if문"의 마지막 문제이다.
마지막 문제답게 38%라는 낮은 정답 비율을 가지고 있다.
문제를 그냥 읽어보면 어려워 보이지는 않는데 왜이렇게 정답 비율이 낮을까?
45분 일찍 알람을 설정한다는 것은 주어진 시간에 "-45분"만 하면 되는데...
필자는 하루의 시작(자정)을 0으로 하고,
몇시 몇분 단위가 아니라, 자정으로 부터 몇분이 지났는지를 기준으로 시간을 나타내주었다.
예를 들어,
"10시 10분" 이라면 (10*60 + 10) = 610 으로 표현하는 것이다.
이때 시계를 45분 일찍 맞춘다는 것은 주어진 시간에 "-45"를 하면 된다.
여기까지는 쉽다.
하지만 예외사항이 존재한다.
바로 주어진 시간이 45보다 작을 때,
즉 예제 입력 2번과 같이 -45를 했을 때 음수가 나오는 경우이다.
이 경우,
1440 - (45 - 입력받은 수) 로 처리하면 된다.
24 : 00 은 자정으로 부터 1440 분이 지난 시간이다.
만약 00 : 30 이 주어졌다면,
45분 일찍 시계를 맞춘다는 것은 23 : 45 로 맞추는 것이다.
23 : 45 은 24 : 00 에서 15분 일찍 시계를 맞춘것이다.
다시 말하면 주어진 시간 30 에서 45 을 뺀 -15분을 24 : 00, 즉 1440 에 더해준다는 것이다.
이를 식으로 표현하면
1440 - (45 - 주어진 시간) 이 된다.
예외사항 처리까지 하면 문제는 매우 간단해진다.
- 첫 번째 방법 - Scanner + StringTokenizer
import java.util.Scanner;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
StringTokenizer st = new StringTokenizer(in.nextLine());
int hour = Integer.parseInt(st.nextToken());
int min = Integer.parseInt(st.nextToken());
int time = 60 * hour + min;
if(time < 45) {
time = 1440 - (45 - time);
}else {
time -= 45;
}
hour = time / 60;
min = time % 60;
System.out.println(hour + " " + min);
}
}
- 두 번째 방법 - BufferedReader + StringTokenizer
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
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 hour = Integer.parseInt(st.nextToken());
int min = Integer.parseInt(st.nextToken());
int time = 60 * hour + min;
if(time < 45) {
time = 1440 - (45 - time);
}else {
time -= 45;
}
hour = time / 60;
min = time % 60;
System.out.println(hour + " " + min);
}
}
Scanner에 비해 시간적인 측면에서 우수한 BufferedReader를 사용해주었다.
- 느낀 점
예외처리의 중요성
'[JAVA] > 자바[JAVA] 백준' 카테고리의 다른 글
BOJ(백준 온라인 저지) 9093번 with 자바[JAVA] (0) | 2022.01.18 |
---|---|
BOJ(백준 온라인 저지) 10828번 with 자바[JAVA] (0) | 2022.01.18 |
BOJ(백준 온라인 저지) 14681번 - 단계별로 풀어보기 with 자바[JAVA] (0) | 2022.01.12 |
BOJ(백준 온라인 저지) 2753번 - 단계별로 풀어보기 with 자바[JAVA] (0) | 2022.01.12 |
BOJ(백준 온라인 저지) 9498번 - 단계별로 풀어보기 with 자바[JAVA] (0) | 2022.01.12 |