백준 알고리즘/조건문

백준 2884번 :: 알람 시계

Sun720 2022. 5. 18. 00:01

▶ 문제

https://www.acmicpc.net/problem/2884

 

2884번: 알람 시계

상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다. 상근이는 모든 방법을 동원해보았지만,

www.acmicpc.net

 

 

 

 설명

조건문을 이용한 시계의 시/분을 다루는 문제이다.

시계는 24시 & 60분 단위로 표시되기 때문에 익숙한 10진수 체계에서 벗어나 생각해야 한다.

 

일어나야 할 시각의 분 단위가 45 미만일 경우 45분 전으로 알람을 맞추게 되면 시 단위는 1시간 아래로 내려가게 된다.

반대로, 분 단위가 45분~59분일 경우엔 45분 전으로 알람을 맞추어도 시 단위는 1시간 아래로 내려가지 않고 그대로일 것이다. 

이렇게 시 단위가 1시간 내려가나 안내려가냐를 기준으로 크게 if ~ else 문을 만들 수 있다.

 

일어나야 할 시각의 분 단위가 45분 미만일 때  시 단위와 분 단위가 모두 바뀌게 된다.

먼저 시 단위는 0시 일 경우 23시로 시 단위가 내려가야 하고,

분 단위는 - (마이너스) 값이 나오지 않도록 일어나려는 시각의 분을 45에서 뺀 뒤, 60분에서 한 번 더 빼주도록 한다.

 

예제에서처럼

10:10 에 일어나려고 할 때 45분 전으로 알람을 맞추려고 한다면,

10분을 가리키고 있으므로 45분 이전은 60분 - (45분 - 10분) 을 연산하여 25분이라는 것을 구할 수 있고,

시 단위는 10에서 1을 뺀 9시라는 것을 알아낼 수 있다.

그럼 최종적으로 9:25이 된다.

 

 

문제 풀이

🌱 풀이

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 NumberFormatException, IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		
		String str = br.readLine();
		StringTokenizer strTo = new StringTokenizer(str, " ");
		int h = Integer.parseInt(strTo.nextToken());
		int m = Integer.parseInt(strTo.nextToken());
		
		// 분침이 45분 이하일 경우 시침이 1개 내려가고, 분침은 60-(45-현재분) 로 이동한다.
		if (m < 45) {
			// 0시일 경우
			if (h == 0) {
				h = 23;
			}else {
				h -= 1;
				
			}
			m = 60-(45-m);
		}
		// 분침이 45분 이상일 경우 (46~59분), 시침은 그대로이고 분침만 내려간다.
		else {
			m -= 45;
		}
		
		System.out.println(h + " " + m);
	}
}

 

 

 

Log

처음엔 단순한 문제라고만 생각했는데 코드로 만들려고 보니 그다지 쉽지만은 않았다.

조건 분기를 적절히 해야 하는데 조건이 늘어날 수록 머리 속이 복잡해지는 느낌이 들었다.

복잡한 것 같아서 노트에 말로 적어가면서 하니 그나마 해결하는 데 도움이 되었다.

728x90
반응형