본문 바로가기
개발/백준 알고리즘

[백준] 2884: 알람 시계 (Python)

1. 문제

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

문제 요약: 현재 설정된 알람 시각 (H시 M분)이 주어질 때, 이보다 45분 일찍 울리는 알람 시각을 계산하는 문제입니다


2. 풀이

이 문제는 주어진 시간에서 45분을 빼는 시간 계산 문제입니다. 분(M)을 뺐을 때 0보다 작아지는 경우를 처리하는 것이 핵심입니다.

접근법 중 하나는 모든 시간을 '분' 단위로 통일해서 계산하는 것입니다

  1. 주어진 시간(H시 M분)을 0시 0분부터 몇 분이 지났는지로 환산합니다
    총 분 = H * 60 + M
  2. 환산된 총 분에서 45분을 뺍니다.
    새로운 총 분 = (H * 60 + M) - 45
  3. 계산된 '새로운 총 분'을 다시 시간과 분으로 변환합니다.
    새로운 시 = 새로운 총 분 // 60 (60으로 나눈 몫)
    새로운 분 = 새로운 총 분 % 60 (60으로 나눈 나머지)

이때 0시 30분처럼 계산 결과가 음수가 되는 경우(-15분)를 처리해야 합니다. 하루는 총 24 * 60 = 1440분이므로, 음수가 나올 경우 1440분을 더해주면 올바른 시간으로 변환할 수 있습니다.

시간/공간 복잡도: 입력값으로 몇 가지의 간단한 연산만 하므로 시간, 공간 복잡도 모두 O(1) 입니다

 

1. 입력 처리 및 분으로 환산

H, M = map(int, input().split())

#주어진 시간을 0시 0분부터 흐른 총 시간(분)으로 변환
total_minute = H * 60 + M

먼저 시간을 입력받은 뒤, 시간 * 60 + 분 공식을 이용해 총 몇 분이 지났는지를 계산합니다.

2. 시간 계산 및 변환

#45분을 뺀 새로운 시간을 계산
new_minute = total_minute - 45

#만약 계산 결과가 음수라면, 하루 전이므로 24시간(1440분)을 더해줌
if new_minute < 0:
    new_minute += 24 * 60

#계산된 총 분을 다시 시간과 분으로 변환
new_H = new_minute // 60
new_M = new_minute % 60

총 분에서 45를 빼고 결과가 음수인지 확인합니다. 음수이면 하루 전으로 돌아간 것이므로 하루치 분(1440)을 더해 양수로 만들어 줍니다. 마지막으로 몫과 나머지 연산(//, %)을 이용해 최종 시간과 분을 구합니다.

전체 코드

#사용자로부터 시간(H)과 분(M)을 입력받음
H, M = map(int, input().split())

total_minute = H * 60 + M

new_minute = total_minute - 45

#계산 결과가 음수일 경우 (자정을 넘어 하루 전으로 갈 경우)
#하루는 24 * 60 = 1440분이므로, 1440분을 더해줌
if new_minute < 0:
    new_minute += 1440

#계산된 총 분을 다시 시간과 분으로 변환
#60으로 나눈 몫이 시간(H), 나머지가 분(M)
new_H = new_minute   //60
new_M = new_minute % 60

print(new_H, new_M)

3. 회고

어려웠던 점: 시간 계산 자체는 어렵지 않았지만, 0시에서 45분 이전으로 돌아갈 때 23시가 되어야 하는 경계값 처리를 놓치기 쉬웠습니다. 코딩 테스트에서는 예외적인 상황을 꼼꼼하게 생각하는 습관이 중요한 것 같습니다.

 

개선할 점: if new_minute < 0: 부분은 final_minute = (total_minute - 45 + 1440) % 1440 와 같이 나머지 연산(%)을 사용하면 한 줄로 더 간결하게 표현할 수 있습니다. + 1440을 먼저 해줘서 음수가 되는 것을 방지하고 % 1440으로 하루를 넘는 경우까지 처리하는 방법입니다.