Algorithms/백준

[백준] 2525번 '오븐 시계' - Java

LEFT 2022. 9. 4. 14:52

<문제 제시>

<예시 입출력>


<문제 해결 과정>

백준 2884번 : 알람 시계와 비슷하게 '시간'을 다루는 문제이다.

알람 시계에서는 45분을 일찍 일어나야해서 -45를 해주는 것이 있었다면

이번 오븐 시계에서는 조리 후의 시간을 알려주는 시계를 만드는 것이므로 + m (분) 을 해주어야한다.

<처음 작성한 오답 코드>

		int total = m + ing;
		
		if(m < ing) {
			h++; 
			
			if(total == 120) { 
				h++;  
				m = 0; 
			}
			
			else if(h >= 24) { 
				h = h - 24; 
			}
			
			else if(m >= 60) {
				m = 60 - m;
			}
			
			m = 60 - (total);
			m = Math.abs(m);
			if(m == 60) {
				m = 0;
			}
			
			System.out.println(h + " " + m);
		}
		else { 
			if(h >= 24) { 
				h = h - 24; 
			}
			
			else if((total) >= 60) { 
				h++; 
				m = 60 - (total);
				m = Math.abs(m); 
				
				if(h == 24) {
					h = 0;
				}
				total = m;
			}
			System.out.println(h + " " + (total));
		}

먼저 변수는 h = 현재 시각 m =  현재 분, ing = 조리 시간, total = 현재 시각으로부터 조리 시간 후의 분 으로 정해주었다.

이번에도 예제 입력과 출력이 다양한 것을 보고 그 조건들에 다 부합하게 만들면 되지 않을까 싶었다.

처음 m < ing는 조리시간보다 현재 시각이 작은 경우 일반적으로 처리되는 조건을 만들었는데, 

그 안에 세부적으로 총 걸린 분(m)이 120이 되면 h++ 을 한번 더 해준 후 분(m)은 0을 만들어주는 것을 만들었다.

또한 시간이 25시 처럼 24시이거나 24시를 초과하게된다면 24를 빼주어 연산을 해보았다.

60분 기준이므로 m = 60 - m 경우도 그 경우였다.

코드가 복잡해졌지만 여러 조건을 입력하다보니 예제들이 통과되는 것을 확인할 수 있었고,

채점을 받아봤지만, '오답' 이었다.

코드가 긴 것도 문제였지만 효율적인 코드는 없을까하고 다른 블로그를 참고해보았다.

참고한 결과 시간과 분을 통합한 후 연산한 후에 다시 시간과 분으로 바꿔주는 방식이 효과적일 것 같았다.

int min = a * 60 + b;

 

을 통해 시간 x 60 으로 분(m)으로 연산 후 현재 분(m)을 더해서 총 분(m)을 만들 수 있었다.

		int min = a * 60 + b;
		min = min + c;

여기에 조리시간까지 더하면 이제 연산할 준비가 끝난 것이다.

딱히 조건문이 필요없이 조리시간까지 더한 이 데이터를 연산해주면 되는 것이었다.


<전체코드>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main {

	public static void main(String[] args) throws IOException{
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	
		String[] time = br.readLine().split(" ");
		String m = br.readLine();
		
		int a = Integer.parseInt(time[0]); // 시간(24)
		int b = Integer.parseInt(time[1]); // 분(60)
		 
		int c = Integer.parseInt(m); // 걸리는 시간
	
		// 시, 분을 통합하는 방법
		int min = a * 60 + b;
		min = min + c;
		
		int hour = (min / 60) % 24; // 24시 이상일 경우를 고려
		int minute = min % 60;
		
		System.out.println(hour + " " + minute);
		
	}
}

시간은 (min / 60) 으로 시간을 만든 후 % 24 를 처리해주어 24시간을 기준으로 나머지가 시간으로 지정되도록 한다.

분은 min % 60 으로 60분을 기준으로 나머지가 분으로 지정되도록 한다.



참고)
https://st-lab.tistory.com/292

 

[백준] 2525번 : 오븐 시계 - JAVA [자바]

https://www.acmicpc.net/problem/2525 2525번: 오븐 시계 첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23

st-lab.tistory.com


문제링크)
https://www.acmicpc.net/problem/2525

 

2525번: 오븐 시계

첫째 줄에 종료되는 시각의 시와 분을 공백을 사이에 두고 출력한다. (단, 시는 0부터 23까지의 정수, 분은 0부터 59까지의 정수이다. 디지털 시계는 23시 59분에서 1분이 지나면 0시 0분이 된다.)

www.acmicpc.net