당신은 인사팀 직원으로, 각 직원의 근태를 확인하고자 한다.
당신의 회사는 자율출퇴근제를 실시하기 때문에 각 직원이 정확히 몇 시에 출근하는 것은 중요하지 않고, 총 근로 시간이 몇 분인지가 중요하다. 총 근로 시간이 법정근로시간을 초과하지 않아야 하면서, 회사와 직원 사이에 계약한 시간 이상이어야 하기 때문이다.
직원이 하루 동안 근무한 시간은 출근 시각과 퇴근 시각 사이의 시간으로 정의한다. 이 문제에서는 식사 시간 등 근무 외 시간을 근무 시간에서 제외하지 않음에 유의하라.
월요일부터 금요일까지 휴가를 쓰지 않은 직원이 매 요일 언제 출근하고 언제 퇴근했는지가 주어질 때, 이 직원이 5일 동안 총 몇 분을 근무했는지를 구하는 프로그램을 작성하라.
직원은 밤을 새서 일하지 않았다. 즉, 출근 시각과 퇴근 시각은 00:00 이후, 24:00 이전에 이루어졌다.
출퇴근 시각은 HH:MM과 같은 형식으로 주어진다.
HH는 00, 01, 02, .., 22, 23 중 하나이다.
MM는 00, 01, 02, .., 58, 59 중 하나이다.
직원은 매일 1분 이상은 일하였다.
첫 번째 줄에는 월요일에 출근한 시각과 월요일에 퇴근한 시각이 공백 하나를 사이로 두고 주어진다.
두 번째 줄에는 화요일에 출근한 시각과 화요일에 퇴근한 시각이 공백 하나를 사이로 두고 주어진다.
세 번째 줄에는 수요일에 출근한 시각과 수요일에 퇴근한 시각이 공백 하나를 사이로 두고 주어진다.
네 번째 줄에는 목요일에 출근한 시각과 목요일에 퇴근한 시각이 공백 하나를 사이로 두고 주어진다.
다섯 번째 줄에는 금요일에 출근한 시각과 금요일에 퇴근한 시각이 공백 하나를 사이로 두고 주어진다.
첫 번째 줄에 직원의 총 근무 시간을 분 단위로 출력한다.
<입력>
10:00 19:00
09:00 15:00
10:00 11:00
11:00 22:00
09:00 15:00
<출력>
1980
월요일에 9시간, 화요일에 6시간, 수요일에 1시간, 목요일에 11시간, 금요일에 6시간을 근무하였다. 총 근무 시간은 9 + 6 + 1 + 11 + 6 = 33시간, 즉 33 × 60 = 1980분이다.
from datetime import datetime
worktime = [list(input().split()) for _ in range(5)] ## 문자로 입력받음
answer = 0 ## 총 근무시간 (초기화)
for i in range(5):
a = datetime.strptime(worktime[i][0], '%H:%M') ## 문자열 형식의 출근시간을 datetime 객체로 변환
b = datetime.strptime(worktime[i][1], '%H:%M') ## 문자열 형식의 퇴근시간을 datetime 객체로 변환
diff = ((b-a).seconds) // 60 ## 그냥 b-a는 '%H:%M' 포맷 형식이기 때문에 초로 바꿔준 후 60을 나누어 분으로 다시 바꾼다
answer += diff ## 총 근무시간에 누적
print(answer)
10:00 19:00
09:00 15:00
10:00 11:00
11:00 22:00
09:00 15:00
1980
datetime
모듈과 datetime
클래스위의 문제와 같이 시간 혹은 날짜 데이터를 처리하고 싶다면, datetime
모듈을 불러와 사용해야 한다.
풀이에서 사용한 datetime
클래스는 날짜와 시간을 동시에 표현하기 위해서 사용된다. 연/월/일/시/분/초/마이크로초 시간대와 원하는 datetime 포맷 형식을 인자로 받아 해당 포맷에 맞게 날짜와 시간을 바꿔준다.
from datetime import datetime
datetime.strptime(변환대상, "포맷")
문자열 형식으로 입력받은 날짜/시간 데이터를 원하는 포맷의 datetime 객체로 바꿔주는 함수
datetime 포맷 | 의미 | 비고 |
---|---|---|
%Y | 년 | 앞의 공백을 0으로 채우는 4자리 숫자 연도 |
%m | 월 | 앞의 공백을 0으로 채우는 2자리 숫자 월 |
%d | 일 | 앞의 공백을 0으로 채우는 2자리 숫자 일 |
%H | 시 | 앞의 공백을 0으로 채우는 2자리 숫자 시간(24시간) |
%M | 분 | 앞의 공백을 0으로 채우는 2자리 숫자 분 |
%s | 초 | 앞의 공백을 0으로 채우는 2자리 숫자 초 |
%A | 요일 | 영어로 된 요일 |
%B | 월 | 영어로 된 월 |
총 근무한 시간을 계산해야 하기 때문에 퇴근시간(b
)에서 출근시간(a
)을 뺀 값을 분으로 바꿔준 후 평일동안의 누적합을 구하면 된다.
※ 만약에 아무런 처리 없이 b
에서 a
를 그냥 뺀다면 어떻게 될까?
from datetime import datetime
a, b = input().split()
a = datetime.strptime(a, '%H:%M')
b = datetime.strptime(b, '%H:%M')
work = b - a
print(work)
09:00 15:00
6:00:00
풀이에서 a
, b
는 datetime 객체로 바꿔준 상태의 출/퇴근 시간이기 때문에 b-a
에 대한 누적합을 구할 경우 답은 '%H:%M:%S'
의 형태로 출력된다.
때문에 '분' 단위로 출력하기 위해서는 먼저 근무한 시간(b-a
)를 (b-a).seconds
를 통해서 '초'단위로 바꿔준 다음, 이를 60으로 나누어 '분'으로 바꿔준다. (초 -> 분 : 1초 = 1/60 분
)
날짜/시간 차를 diff
라 할 때,
diff.days
: datetime 객체의 연산값을 '일' 단위로 바꿔준다.
diff.seconds
: datetime 객체의 연산값을 '초' 단위로 바꿔준다.
diff.microseconds
: datetime 객체의 연산값을 '마이크로초' 단위로 바꿔준다.