🔎 문제
당신은 인사팀 직원으로, 각 직원의 근태를 확인하고자 한다.
당신의 회사는 자율출퇴근제를 실시하기 때문에 각 직원이 정확히 몇 시에 출근하는 것은 중요하지 않고, 총 근로 시간이 몇 분인지가 중요하다. 총 근로 시간이 법정근로시간을 초과하지 않아야 하면서, 회사와 직원 사이에 계약한 시간 이상이어야 하기 때문이다.
직원이 하루 동안 근무한 시간은 출근 시각과 퇴근 시각 사이의 시간으로 정의한다. 이 문제에서는 식사 시간 등 근무 외 시간을 근무 시간에서 제외하지 않음에 유의하라.
월요일부터 금요일까지 휴가를 쓰지 않은 직원이 매 요일 언제 출근하고 언제 퇴근했는지가 주어질 때, 이 직원이 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 x 60 = 1980(분) 이다.
나의 풀이
import sys
from datetime import datetime
record = [list(input.split()) for _ in range(5)] # 근무기록 'str'타입으로 입력받기
total = 0 # 총 근무시간
for i in range(5):
s = datetime.strptime(record[i][0], '%H:%M') # 출근시간(str -> datetime)
e = datetime.strptime(record[i][1], '%H:%M') # 퇴근시간(str -> datetime)
worktime = ((e-s).seconds)//60 # 하루 근무 시간 (e-s)는 '%H:%M:%S' 포맷 형식이기 때문에 초로 바꿔준 후 60을 나누어 분으로 변환
total += worktime # 총 근무시간에 누적
print(total) # 정답 출력
✅ 정리
1. datetime 모듈과 datetime 클래스
이번 문제와 같이 '시간' 혹은 '날짜' 데이터를 처리하고 싶다면, 우선 datetime
모듈을 불러와야 한다.
풀이에서 사용한 datetime
클래스는 날짜와 시간을 동시에 표현하기 위해서 사용된다.
연/월/일/시/분/초/마이크로초 시간대와 원하는 datetime 포맷 형식을 인자로 받아 해당 포맷에 맞게 날짜와 시간을 바꿔준다
from datetime import datetime
2. datetime.strptime(변환대상, "포맷")
문자열 형식으로 입력받은 날짜/시간 데이터를 원하는 포맷의 datetime 객체로 바꿔주는 함수
📌 datetime 포맷
datetime 포맷 | 의미 | 비고 |
---|---|---|
%Y | 년 | 앞의 공백을 0으로 채우는 4자리 숫자 연도 |
%m | 월 | 앞의 공백을 0으로 채우는 2자리 숫자 월 |
%d | 일 | 앞의 공백을 0으로 채우는 2자리 숫자 일 |
%H | 시 | 앞의 공백을 0으로 채우는 2자리 숫자 시간(24시간) |
%M | 분 | 앞의 공백을 0으로 채우는 2자리 숫자 분 |
%s | 초 | 앞의 공백을 0으로 채우는 2자리 숫자 초 |
%A | 요일 | 영어로 된 요일 |
%B | 월 | 영어로 된 월 |
3. 날짜 or 시간 연산
총 근무한 시간을 계산해야 하기 때문에 퇴근시간(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 객체의 연산값을 '마이크로초' 단위로 바꿔준다.
'취업준비 > 코딩테스트 문제 풀이' 카테고리의 다른 글
[프로그래머스 SQL 고득점 Kit] SELECT - 흉부외과 또는 일반외과 의사 목록 출력하기 (1) | 2024.03.26 |
---|---|
[프로그래머스 SQL 고득점 Kit] SELECT - 3월에 태어난 여성 회원 목록 출력하기 (1) | 2024.03.26 |
[Baekjoon] 백준 10816. 숫자 카드 2 (1) | 2023.12.24 |
[Baekjoon] 백준 1158. 요세푸스 문제 (0) | 2023.12.15 |
[Baekjoon] 백준 10828. 스택 (0) | 2023.12.12 |