우당탕탕 파이썬 with 하루하나 알고리즘

백준 2884 파이썬 - if문을 사용해 45분 앞서는 시간 확인하기

hyxndy 2022. 3. 16. 13:49

백준 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문이 총 두 번 사용된다.

 

 

이번에도 간단한 뼈대를 잡은 후 코딩을 시작하겠다.

먼저 HM을 각각 주어진 시와 분이라고 변수를 지정해놓는다.

 

그리고 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)