[백준] 2525번 : 오븐 시계 - JAVA [자바]
https://www.acmicpc.net/problem/2525
2525번: 오븐 시계
첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)
www.acmicpc.net
- 문제

직전 문제인 알람 시계(2884번)와 거의 유사한 문제라 해당 문제를 풀었다면 어렵지 않게 풀 수 있었으리라 본다.
만약 아직 풀지 않으셨다면 해당 문제를 먼저 보고오시는 것을 추천드린다.
- 알고리즘 [접근 방법]
이 번 문제는 알람 시계 문제의 반대라고 보시면 된다.
알람 시계 문제에서는 주어진 시간에서 45분을 뺐어야 했다면 이 문제에선 사용자 입력에 따라 C분을 더해야 한다.
이 때 주어지는 입력을 주의 깊게 봐야하는데, C의 입력값은 0~1000으로 이를 시분으로 표현하자면 0시간 0분부터 16시간 40분까지라는 것이다.
그러면 크게 풀이하는 방법은 두 가지가 있다.
1. A(시)와 B(분)을 하나의 분으로 변환한 뒤, C를 더하고 나온 결과 값을 다시 시와 분 으로 변환하는 방법
2. C를 시와 분으로 변환한 뒤, 각 나뉘어진 시와 분을 A와 B에 각각 더하여 연산하는 방법
이렇게 있다.
이 중 편한 방법으로 풀이하면 되나, 필자는 첫 번째 방법을 사용해보도록 하겠다. (두 번째 방법으로 하면 분에서 60분이 넘어 시로 올림이 발생하는 것도 고려해야하기 때문에 번거로울 것이라 판단되기에..)
먼저 입력받은 A(시)와 B(분)을 하나의 분으로 변환하는 것은 어렵지 않을 것이다.
min = A * 60 + B; // min = 60 * 시 + 분
이게 끝이다.
그 다음 해야 할 것은 요리하는데 걸린 시간인 C를 더해야하지 않겠는가?
min = A * 60 + B; // min = 60 * 시 + 분 min = min + C; // 요리하는데 걸린 시간 더하기
그렇다면 이제 저 값을 다시 시와 분으로 나누어야 겠다.
분을 시로 바꾸는 방법은 60을 나눈 몫이 되지 않겠는가?
예로들어 min이 1100이라고 하자.
그러면 '시'를 구하기 위해서는 1시간=60분이므로 60분 단위로 짤려야 할 테니, 1100/60 의 몫인 18시가 우리가 구하고자 하는 시가 되겠다.
반대로 '분'을 구하기 위해서는 어떻게 해야할까? 60으로 나눈 '나머지'값이 분이 되지 않을까? 즉, 나머지를 구하기 위한 모듈로 연산이 필요하다.
그러면 1100 % 60 = 20이므로, 우리가 구하고자 하는 분은 20분이 되는 것이다.
min = A * 60 + B; // min = 60 * 시 + 분 min = min + C; // 요리하는데 걸린 시간 더하기 hour = min / 60; // 시 minute = min % 60; // 분
여기서 주의 해야 할 점이 있다.
입력값을 한 번 잘 보자. A(시)의 경우 0~23이라 했다. 위에서 다시 시와 분으로 변환 할 때, 24 이상이면 어떻게 해야하는지를 고려하지 않았다.
예로들어 A와 B가 23 00 이고, C가 120 이라면?
그러면 A * 60 + B = 1380 이고, C를 더하면 1500이다.
이를 시와 분으로 다시 변환하면, 25 0 이다. 즉, 25시 0분이다. 하지만 문제를 읽어보면 출력은 시간은 0~23 사이의 값으로 출력하라고 했으니, 원래 출력해야 할 문장은 1 0 이다.
즉, hour에도 24 이상일 경우 다시 0시부터 시작하도록 24를 나눈 나머지 연산을 필요로 한다.
이를 정리해서 보자면 다음과 같이 구해지게 된다.
min = A * 60 + B; // min = 60 * 시 + 분 min = min + C; // 요리하는데 걸린 시간 더하기 hour = (min / 60) % 24; // 시 (24시 이상이 될 경우 0시부터 시작하도록 한다) minute = min % 60; // 분
위와 같이 작성되어야 비로소 올바른 문장이 나온다.
- 2가지 방법을 사용하여 풀이한다.
이전 포스팅과 여타 다를 바 없이 아래와 같이 2가지 입출력 방법을 통해 성능을 비교해보려 한다.
1. Scanner
2. BufferedReader
- 풀이
- 방법 1 : [Scanner]
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int A = in.nextInt(); int B = in.nextInt(); int C = in.nextInt(); int min = 60 * A + B; // 시 -> 분 min += C; int hour = (min / 60) % 24; int minute = min % 60; System.out.println(hour + " " + minute); } }
가장 기본적인 방법이라 할 수 있겠다.
- 방법 2 : [BufferedReader]
입력 방법을 Scanner 대신 BufferedReader 을 사용하여 풀이하는 방법이다. 단, BufferedReader 는 문자열을 한 줄로 읽기 때문에 A와 B을 구분하기 위해 공백을 기준으로 문자열을 분리해주어야하니 StringTokenizer 을 사용하여 풀도록 하겠다.
import java.io.BufferedReader; import java.io.InputStreamReader; 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 A = Integer.parseInt(st.nextToken()); int B = Integer.parseInt(st.nextToken()); int C = Integer.parseInt(br.readLine()); int min = 60 * A + B; // 시 -> 분 min += C; int hour = (min / 60) % 24; int minute = min % 60; System.out.println(hour + " " + minute); } }
크게 어려운 부분은 없었으리라 본다.
- 성능

채점 번호 : 46483349 - 방법 2 : BufferedReader
채점 번호 : 46483346 - 방법 1 : Scanner
입력의 경우는 확실히 Scanner 보다는 BufferedReader 가 빠른 걸 볼 수 있다.
- 정리
간단한 산수 연산이라 어려운 점은 없었을 것이다. 다만, 위와 같은 방법으로 풀 때, 시간이 넘칠경우 어떻게 해야하는지 이러한 부분을 잘 고려하 풀어야 한다. 만약 어렵거나 이해가 되지 않은 부분이 있다면 언제든 댓글 남겨주시면 최대한 빠르게 답변드리겠다.
'JAVA - 백준 [BAEK JOON] > 조건문' 카테고리의 다른 글
[백준] 2480번 : 주사위 세개 - JAVA [자바] (4) | 2022.08.04 |
---|---|
[백준] 14681번 : 사분면 고르기 - JAVA [자바] (2) | 2020.03.17 |
[백준] 2884번 : 알람 시계 - JAVA [자바] (24) | 2020.02.14 |
[백준] 2753번 : 윤년 - JAVA [자바] (19) | 2020.02.13 |
[백준] 9498번 : 시험 성적 - JAVA [자바] (0) | 2020.02.13 |
댓글을 사용할 수 없습니다.