1. 2884 알람 시계
문제
상근이는 매일 아침 알람을 듣고 일어난다. 알람을 듣고 바로 일어나면 다행이겠지만, 항상 조금만 더 자려는 마음 때문에 매일 학교를 지각하고 있다.
상근이는 모든 방법을 동원해보았지만, 조금만 더 자려는 마음은 그 어떤 것도 없앨 수가 없었다.
이런 상근이를 불쌍하게 보던 창영이는 자신이 사용하는 방법을 추천해 주었다.
바로 "45분 일찍 알람 설정하기"이다.
이 방법은 단순하다. 원래 설정되어 있는 알람을 45분 앞서는 시간으로 바꾸는 것이다. 어차피 알람 소리를 들으면, 알람을 끄고 조금 더 잘 것이기 때문이다. 이 방법을 사용하면, 매일 아침 더 잤다는 기분을 느낄 수 있고, 학교도 지각하지 않게 된다.
현재 상근이가 설정한 알람 시각이 주어졌을 때, 창영이의 방법을 사용한다면, 이를 언제로 고쳐야 하는지 구하는 프로그램을 작성하시오.
입력
첫째 줄에 두 정수 H와 M이 주어진다. (0 ≤ H ≤ 23, 0 ≤ M ≤ 59) 그리고 이것은 현재 상근이가 설정한 알람 시간 H시 M분을 의미한다.
입력 시간은 24시간 표현을 사용한다. 24시간 표현에서 하루의 시작은 0:0(자정)이고, 끝은 23:59(다음날 자정 1분 전)이다. 시간을 나타낼 때, 불필요한 0은 사용하지 않는다.
출력
첫째 줄에 상근이가 창영이의 방법을 사용할 때, 설정해야 하는 알람 시간을 출력한다. (입력과 같은 형태로 출력하면 된다.)
H, M = map(int, input().split())
if M >= 45:
print(H, M-45)
elif H > 0:
print(H-1, M+15)
else:
print(23, M+15)
코드 설명
input()으로 입력받은 문자열 데이터를 split 메서드로 분할한다. map 함수로 두 데이터에 int 함수를 적용, 정수형 데이터로 변환했다. 그리고 두 데이터를 H(Hour), M(Minute) 변수에 저장했다.
기본 시각에서 45분 전으로 알람을 맞추는 조건이 있다.
60분이 1시간이므로 M에서 45를 빼려면 주의가 필요하다.
if 조건문을 통해 M이 45보다 크거나 같을 때를 먼저 처리했다.
기존 시각의 분이 45분 이상일 경우 H는 그대로 M은 45을 뺀 값을 반환한다.
그 다음은 시간이 0시 이상일 때이다.
위에서 if문으로 M이 45 이상일 때를 처리했으니 이제 M이 45보다 작은 데이터만 남아있다.
시간이 0시 이상일 때만 시간에서 1을 뺀 값을 반환할 수 있다.
그렇지 않으면 현재 시간이 0시 25분일 때 알람 시간이 -23시 40분으로 반환된다.
M이 빼야되는 값인 45보다 작을 경우, M에서 15를 더한다.
한 시간은 60분이므로 M에 60을 미리 더하고 45를 빼는 M+60-45를 떠올리면 이해하기 쉽다.
따라서 M이 45보다 작고 H가 0시 이상일 때 H-1, M+15를 반환한다.
마지막으로 M이 45보다 작고 H가 0시일 때는 23, M+15를 반환한다.
H가 0일 때, 1을 빼서 -23이 반환되는 것을 막기 위해서이다. M 값은 위와 같다.
2. 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분이 된다.)
H, M = map(int, input().split())
T = int(input())
H += T//60
M += T%60
if M >= 60:
H += 1
print(H%24, M-60)
else:
print(H%24, M)
코드 설명
너무 어려워서 한참 헤맸다. 온갖 경우의 수가 다 떠오르고, 그걸 코드로 정리하는 게 어려웠다.
첫째 줄에서 현재 시각을 H, M 으로 정의하고 그 다음 줄에서 조리 시간인 T를 정의하는 것까지는 간단하다.
그 다음 T를 60으로 나눈 몫을 H에 더하고, T를 60으로 나눈 나머지를 M에 더했다.
- 현재 시각이 10 : 53이고 조리 시간이 135(분)이라고 가정해보자.
135 // 60 = 2, 135 % 60 = 15 이므로 H는 10+2가, M에는 53+15가 된다.
이 문제를 풀 때 M+T를 if 조건문에서 한 번에 처리해야 된다는 생각에 골머리를 앓았다.
T를 몫과 나머지로 나눠서 H와 M에 더하고, 결과값에 조건문을 쓸 수도 있었다.
T값을 미리 처리했으니, 이제 간단한 조건문만 남았다.
M(사실은 M + T%60)이 60 이상일 때 H에 1을 더한다.
T를 60으로 나눠주고 나머지만 받아왔기 때문에 M과 T를 합해도 120 이상이 될 수 없다.
즉, H에 1 이상을 더할 필요가 없다.
H값이 23일 경우, 1을 더하면 24가 된다. 디지털 시계는 23:59까지만 표시할 수 있다.
H를 24로 나누고 나머지를 반환해 시간 자리에 출력한다. 23일 때를 제외하고 전부 기존 값을 그대로 반환한다.
윗줄에서 60분이 1시간으로 바뀌었으니 M에서 60을 빼고 분 자리에 출력한다.
M(사실은 M + T%60)이 60 미만일 경우, H를 24로 나눈 나머지와 M을 출력한다.
'코딩 테스트' 카테고리의 다른 글
백준 10950, 8393 풀이 파이썬 반복문 (0) | 2024.03.21 |
---|---|
백준 2480 풀이 파이썬 조건문 (0) | 2024.03.19 |
백준허브 커밋 오류 (0) | 2024.03.17 |
백준 14681 풀이 파이썬 조건문 (2) | 2024.03.17 |
백준 10171, 10172 파이썬 풀이 (0) | 2024.03.17 |