안녕하세요!
이번 포스팅은 백준 알고리즘에서 단계별로 풀어보기 조건문의 2884번 문제 오븐 시계를 풀은 내용에 대해서 설명하겠습니다.
시간은 최대 24, 분은 최대 60이라는 개념만 알고있다면 어렵지 않게 풀 수 있는 문제입니다.
https://www.acmicpc.net/problem/2525
문제
KOI 전자에서는 건강에 좋고 맛있는 훈제오리구이 요리를 간편하게 만드는 인공지능 오븐을 개발하려고 한다. 인공지능 오븐을 사용하는 방법은 적당한 양의 오리 훈제 재료를 인공지능 오븐에 넣으면 된다. 그러면 인공지능 오븐은 오븐구이가 끝나는 시간을 분 단위로 자동적으로 계산한다.
또한, KOI 전자의 인공지능 오븐 앞면에는 사용자에게 훈제오리구이 요리가 끝나는 시각을 알려 주는 디지털 시계가 있다.
훈제오리구이를 시작하는 시각과 오븐구이를 하는 데 필요한 시간이 분단위로 주어졌을 때, 오븐구이가 끝나는 시각을 계산하는 프로그램을 작성하시오.
입력
첫째 줄에는 현재 시각이 나온다. 현재 시각은 시 A (0 ≤ A ≤ 23) 와 분 B (0 ≤ B ≤ 59)가 정수로 빈칸을 사이에 두고 순서대로 주어진다. 두 번째 줄에는 요리하는 데 필요한 시간 C (0 ≤ C ≤ 1,000)가 분 단위로 주어진다.
출력
첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)
문제풀이
먼저 낮은 단위인 "분"으로 환산을 합니다. 이후 요리를 하는데 걸린 시간을 더해줍니다. 이후 다시 시간만큼 나눠 시간과 분을 구합니다.
풀어적는다면 아래와 같이 정리할 수 있습니다.
int min = (60 * H) + M + oven;
hour = (min / 60) % 24;
minute = min % 60;
정답
문제는 두 가지 방법을 사용해서 풀어봤습니다.
먼저 첫 번째 방법에 대해서 알아보겠습니다.
코드1
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 A = Integer.parseInt(st.nextToken()); // 시
int B = Integer.parseInt(st.nextToken()); // 분
int C = Integer.parseInt(br.readLine()); // 요리시간
int min = 60 * A + B + C; // 총 시간
// 총 시간에서 60으로 나누고 24로 나눈 나머지를 구한 값이 시간이 된다.
// 총 시간에서 60을 나눈 나머지 값은 분이 된다.
int hour = (min / 60) % 24;
int minute = min % 60;
StringBuilder sb = new StringBuilder();
sb.append(hour).append(" ").append(minute);
System.out.print(sb);
}
}
먼저 입력을 받을 때 BufferedReader와 StringTokenizer를 사용하여 입력을 받고, 변수 A, B, C에 시간과 분, 요리 시간을 저장합니다.
그 후에 min 변수에는 시간을 분으로 환산하여 더하고, 요리 시간도 더합니다. 이렇게 되면 총 소요 시간인 분 단위가 min에 저장됩니다.
그 다음, hour 변수에는 min을 60으로 나눈 몫을 24로 나눈 나머지를 계산하여 시간을 구하고, minute 변수에는 min을 60으로 나눈 나머지 값을 계산하여 분을 구합니다.
마지막으로, StringBuilder를 사용하여 시간과 분을 정리하고 출력합니다.
코드2
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
public class Main {
public static void main(String[] args) throws Exception {
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()); // 요리시간
B += C; // 분 + 요리시간
// 60분을 넘으면 시간을 더하고, 60을 나눈 나머지값을 분에 넣는다.
if(B >= 60) {
A += B / 60;
B = B % 60;
}
// 시간이 24를 넘으면 24를 뺀다.
if(A >= 24) {
A -= 24;
}
StringBuilder sb = new StringBuilder();
sb.append(A).append(' ').append(B);
System.out.println(sb);
}
}
이 코드는 첫 번째 방법과 거의 유사하게 동작하지만, 조금 다른 점이 있습니다.
먼저 입력을 받는 부분은 동일합니다. 변수 A, B, C에 시간과 분, 요리 시간을 저장합니다.
그 후에 B += C를 통해 분에 요리 시간을 더합니다. 이때, 만약 B가 60 이상이라면 60으로 나눈 몫을 A에 더하고, 60으로 나눈 나머지 값을 B에 저장합니다. 이를 통해 시간이 60을 넘어간 경우에 대한 처리를 합니다.
그 다음, 시간이 24를 넘어가는 경우에 대한 처리를 합니다. 만약 A가 24 이상이라면 24를 뺍니다.
마지막으로, StringBuilder를 사용하여 시간과 분을 정리하고 출력합니다.
속도비교
1번 방식이 2번 방식보다 메모리가 더 적게들지만, 속도는 2번 방식이 약간 더 빠른 것을 볼 수 있네요ㅎ
이상 백준 알고리즘 2525번 오븐 시계를 풀은 내용이었습니다. 추가적인 질문이 있으시면 언제든지 물어보세요!
이전 문제 : 2021.04.22 - [알고리즘/알고리즘JAVA] - [백준알고리즘/JAVA/if문] 2884번 문제 : 알람 시계
'알고리즘 > 알고리즘JAVA' 카테고리의 다른 글
[백준알고리즘/JAVA/if문] 2480번 문제 : 주사위 세개 (1) | 2023.05.30 |
---|---|
[백준알고리즘/기본 수학 2단계] 2581번 문제 : 소수 (0) | 2021.06.20 |
[백준알고리즘/기본 수학 2단계] 1978번 문제 : 소수 찾기 (0) | 2021.05.28 |
[백준알고리즘/기본 수학 1단계] 1011번 문제 : Fly me to the Alpha Centauri (0) | 2021.05.27 |
[백준알고리즘/기본 수학 1단계] 10757번 문제 : 큰 수 A+B (0) | 2021.05.26 |