백준 2884번 - 알람시계 with python
Q. 상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.
상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.
이런 상근이를 불쌍하게 보던, 창영이는 자신이 사용하는 방법을 추천해 주었다.
바로 "45분 일찍 알람 설정하기"이다.
이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.
현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.
첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 놓은 알람 시간 H시 M분을 의미한다.
입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.
정해진 시각에서 45분을 빼는 데에는 두 가지 경우가 존재한다.
먼저 첫 번째의 경우에는 정해진 시각의 분이 45보다 크거나 같은 경우.
다른 경우에는 정해진 시각의 분이 45보다 작은 경우가 있다.
첫 번째 경우에는 간단하다. 그냥 정해진 시각의 분에서 45분을 빼면 된다.
예를 들어 10시 47분에서 45분을 빼야한다면
시는 그대로 놔두고, 분 단위에서 47 - 45를 한 2분이 남는다. 즉, 45분을 빼면 10시 2분이 된다.
후자의 경우에는 조금 식이 복잡할 수 있다.
먼저 주어진 시각이 14시 20분이라고 가정해보자. 여기서 45분을 빼면 13시 35분이 된다.
다른 예를 들어볼까? 17시 15분이라면, 45분 전의 시각은 16시 30분이 될 것이다.
각 시각들의 분 단위만 생각해보자.
20 35
15 30
이 숫자들의 특징은 무엇인가? 45분을 빼고 난 후의 minute이 빼기 전 minute보다 15 정도 크다.
단지 숫자들의 특징만 가지고 식을 세워본다면 (주어진 분 + 15)가 분에 대한 식일 것이다.
이번엔 시 단위를 살펴보자
14 13
17 16
45분 전 시각은 주어진 시각보다 숫자가 1이 작은 것을 볼 수 있다.
즉, 주어진 시각에서 '분'을 나타내는 부분이 45분보다 작다면
hour 부분에서는 -1을 해주고, minute 부분에서는 +15를 해준다.
생각보다 식이 간단하네?라고 생각하는 독자들도 있겠다.
하지만 위의 상황들만 생각하고 코드를 작성하게 된다면 오류가 발생할 것이다.
왜냐하면 0시 mm분일 때의 상황을 생각해주지 않았기 때문이다.
0시이면서 minute >= 45 인 상황에서는 hour에 대한 부분은 따로 변화하는 게 없으므로 신경 쓰지 않아도 되지만,
0시 이면서 minute < 45 인 경우에서는 시를 23시로 바꿔주는 작업이 필요하다.
그래서 이 알람 시계 문제를 해결하려면 if문이 총 두 번 사용된다.
이번에도 간단한 뼈대를 잡은 후 코딩을 시작하겠다.
먼저 H와 M을 각각 주어진 시와 분이라고 변수를 지정해놓는다.
그리고 M >=45인 경우와 M < 45인 경우로 나눠준다.
H = 0 이면서 M < 45 인 경우는 H를 23시로 바꿔주어야하므로, 이 조건을 M < 45 조건문 안에 집어 넣는다.
if M >= 45 인 경우
-> H시 (M - 45)분
if M < 45 인 경우
*H가 0시가 아닐 때
-> (H-1)시 (M + 15)분
*H가 0시일 때
-> 23시 (M + 15)분
의 꼴로 나타날 것이다.
그럼 대충 상황을 이해하였을테니 바로 코드를 실행해보겠다. 백준 문제에 있는 예제를 활용해 결과가 잘 나오는지 확인해보겠다.
모두 출력 결과와 동일하게 나옴을 확인할 수 있다.
<코드>
H, M = map(int,input().split())
if M>= 45:
print(H, M - 45)
elif M < 45: #else문을 사용해주어도 상관 X
if H >=1:
print(H-1, M + 15)
else:
print(23, M + 15)
<다른 코드>
H, M = map(int,input().split())
M -=45
if (M<0):
H-=1
M+=60
if (H<0):
H+=24
print(H, M)
'우당탕탕 파이썬 with 하루하나 알고리즘' 카테고리의 다른 글
백준 2480 파이썬 - if문을 활용해 조건 별 계산 식 도출하기 (0) | 2022.03.18 |
---|---|
백준 2525 파이썬 - if문을 활용해 일정 시간이 지난 시각 확인하기 (0) | 2022.03.17 |
백준 14681 파이썬 - if문을 활용하여 사분면 번호 출력하기 (0) | 2022.03.15 |
백준 2753 파이썬 - if 문에 and, or 연산자 사용하기 (0) | 2022.03.14 |
백준 9498 파이썬 - 시험 점수에 해당하는 등급 출력하기 (0) | 2022.03.13 |